【发布时间】:2016-11-01 17:30:15
【问题描述】:
以以下两条路线为例。
app = Flask(__name__)
@app.route("/somewhere")
def no_trailing_slash():
#case one
@app.route("/someplace/")
def with_trailing_slash():
#case two
根据the docs理解如下:
在第一种情况下,对路由
"/somewhere/"的请求将返回 404 响应。"/somewhere"有效。情况二,
"/someplace/"有效,"/someplace"将重定向到"/someplace/"
我希望看到的行为是 case 2 行为的 'inverse'。例如"/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。也许是蓝图或 url 规则?
【问题讨论】:
-
分别实现并让
/somplace/重定向到/someplace? -
我注意到的是,当您的 Flask 配置中有
DEBUG=True时,尾随空格不会被重定向,但是当DEBUG=False时,它会被重定向。 -
@Busturdust 可能会起作用,但管理起来会很痛苦。我的其他一些想法涉及使用error handler,如果存在无斜线端点,则返回重定向。也可以使用某种蓝图。但是我已经为其他东西使用了 404 错误处理程序(它可以被烘焙,但我宁愿不这样做)而且我不确定它是否可以通过蓝图来实现。理想的解决方案是像全局 url 规则这样的插件。
-
@kiran.koduru 这是一个有趣的观察。我将不得不看一下,尽管出于显而易见的原因,我认为我不会在生产中使用调试标志。我通常使用 Tornado 或 gEvent 部署 Flask。即使我设置了
app.debug = True,它似乎也没有接受 gevent WSGI 环境。我确信有一种方法可以解决 that 问题,但这是另一个问题,正如所解释的那样,对于生产环境,可能不是 this 问题的适用解决方案。跨度>