以下面两条路线为例。
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/"
我希望看到的行为是案例二行为的&#39; <&#39; 。例如"/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
我可以全局应用。也许是蓝图或网址规则?
答案 0 :(得分:20)
使用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])
答案 1 :(得分:0)
如果您希望以相同的方式处理两条路线,我会这样做:
app = Flask(__name__)
@app.route("/someplace/")
@app.route("/someplace")
def slash_agnostic():
#code for both routes
答案 2 :(得分:0)
您还可以在路线定义中使用选项strict_slashes = False:
code {
color: black;
background-color: darken($background-color, 5%);
border-radius: 4px;
overflow: auto;
padding-left: 5px;
}