【问题标题】:Trailing slash triggers 404 in Flask path rule斜杠在 Flask 路径规则中触发 404
【发布时间】:2016-01-19 08:56:03
【问题描述】:

我想将/users 下的任何路径重定向到静态应用程序。以下视图应捕获这些路径并提供适当的文件(它仅打印此示例的路径)。这适用于/users/users/604511/users/604511/action。为什么路径/users/会导致404错误?

@bp.route('/users')
@bp.route('/users/<path:path>')
def serve_client_app(path=None):
    return path

【问题讨论】:

    标签: python flask


    【解决方案1】:

    您的/users 路由缺少尾部斜杠,Werkzeug 将其解释为不匹配尾部斜杠的显式规则。要么添加尾部斜杠,如果 url 没有斜杠,Werkzeug 将重定向,或者在路由上设置 strict_slashes=False,Werkzeug 将匹配带有或不带有斜杠的规则。

    @app.route('/users/')
    @app.route('/users/<path:path>')
    def users(path=None):
        return str(path)
    
    c = app.test_client()
    print(c.get('/users'))  # 302 MOVED PERMANENTLY (to /users/)
    print(c.get('/users/'))  # 200 OK
    print(c.get('/users/test'))  # 200 OK
    
    @app.route('/users', strict_slashes=False)
    @app.route('/users/<path:path>')
    def users(path=None):
        return str(path)
    
    c = app.test_client()
    print(c.get('/users'))  # 200 OK
    print(c.get('/users/'))  # 200 OK
    print(c.get('/users/test'))  # 200 OK
    

    您还可以为所有网址设置strict_slashes

    app.url_map.strict_slashes = False
    

    但是,在大多数情况下,您应该避免禁用严格的斜线。文档解释了原因:

    这种行为允许相对 URL 继续工作,即使尾部斜杠被省略,这与 Apache 和其他服务器的工作方式一致。此外,URL 将保持唯一性,这有助于搜索引擎避免将同一页面编入两次索引。

    【讨论】:

      【解决方案2】:

      全局禁用严格斜线;像这样设置url_map.strict_slashes = False

      app = Flask(__name__)
      app.url_map.strict_slashes = False
      

      这样您就不必为每个视图使用strict_slashes=False

      然后你只需要像这样定义没有斜杠的路线:

      bp = Blueprint('api', __name__, url_prefix='/api')
      @bp.route('/my-route', methods=['POST'])
      

      那么/my-route/my-route/ 的工作方式相同。

      【讨论】:

      • 如果不为每个视图定义斜线,我们如何对蓝图进行严格的斜线?
      • @jchi2241 错过了您一年的评论——抱歉。该示例使用的是蓝图,您可以在应用级别进行配置。
      【解决方案3】:

      这是因为 Werkzeug 与其他 HTTP 服务器的一致性。看看 Flask 的Quickstart documentation。相关段落:

      唯一网址/重定向行为

      Flask 的 URL 规则基于 Werkzeug 的路由模块。这个想法 该模块的背后是确保基于 Apache 和更早的 HTTP 服务器开创的先例。

      采取以下两条规则:

      @app.route('/projects/') 
      def projects():
          return 'The project page'
      
      @app.route('/about') 
      def about():
          return 'The about page'
      

      虽然它们看起来很相似,但它们在使用 URL 定义中的尾部斜杠。在第一种情况下,规范 项目端点的 URL 有一个尾部斜杠。从这个意义上说,它 类似于文件系统上的文件夹。访问它没有 斜杠将导致 Flask 重定向到规范 URL 结尾的斜线。

      然而,在第二种情况下,URL 的定义没有尾随 斜线,更像是类 UNIX 系统上文件的路径名。 使用尾部斜杠访问 URL 将产生 404 “未找到” 错误。

      这种行为允许相对 URL 继续工作,即使 尾部斜杠被省略,与 Apache 和其他 服务器工作。此外,URL 将保持唯一,这有助于搜索 引擎避免两次索引同一页面。

      所以只需将/users/ 也添加到路由中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-04
        • 2022-01-22
        • 1970-01-01
        • 2014-02-04
        • 2013-07-23
        • 2012-11-16
        • 2013-01-28
        • 1970-01-01
        相关资源
        最近更新 更多