Flask 路由中的尾部斜线

新手上路,请多包涵

以下面两条路线为例。

 app = Flask(__name__)

@app.route("/somewhere")
def no_trailing_slash():
    #case one

@app.route("/someplace/")
def with_trailing_slash():
    #case two

根据 文档,可以理解以下内容:

  • 在第一种情况下,对路由的请求 "/somewhere/" 将返回 404 响应。 "/somewhere" 有效。

  • 在第二种情况下, "/someplace/" 有效并且 "/someplace" 将重定向到 "/someplace/"

我希望看到的行为是 案例二 行为的 “逆向” 。例如 "/someplace/" 将重定向到 "/someplace" 而不是相反。有没有办法定义采取这种行为的路线?

根据我的理解, strict_slashes=False 可以在路由上设置,以有效地获得与案例一相同的行为,但我想要做的是让重定向行为始终重定向到 URL 而无需 尾部斜杠。

我想到使用的一种解决方案是对 404 使用错误处理程序,类似这样。 (不确定这是否有效)

 @app.errorhandler(404)
def not_found(e):
    if request.path.endswith("/") and request.path[:-1] in all_endpoints:
        return redirect(request.path[:-1]), 302
    return render_template("404.html"), 404

但我想知道是否有更好的解决方案,例如某种嵌入式应用程序配置,类似于 strict_slashes=False 我可以在全球范围内应用。也许是蓝图或网址规则?

原文由 sytech 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 829
2 个回答

您使用 strict_slashes 进行正确的跟踪,您可以在 Flask 应用程序本身上进行配置。这将为创建的每条路由将 strict_slashes 标志设置为 False

 app = Flask('my_app')
app.url_map.strict_slashes = False

然后,您可以使用 before_request 检测尾随 / 进行重定向。使用 before_request 将允许您不需要将特殊逻辑分别应用于每个路由

@app.before_request
def clear_trailing():
    from flask import redirect, request

    rp = request.path
    if rp != '/' and rp.endswith('/'):
        return redirect(rp[:-1])

原文由 Wondercricket 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您希望以相同的方式处理两条路线,我会这样做:

 app = Flask(__name__)

@app.route("/someplace/")
@app.route("/someplace")
def slash_agnostic():
    #code for both routes

原文由 trpropst 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题