关于python:Flask路线中的尾部斜线

Trailing slash in Flask route

以下面两条路线为例。

1
2
3
4
5
6
7
8
9
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可以在路径上设置,以有效地获得与案例1中案例2相同的行为,但我想做的是获得重定向行为,使其始终重定向到URL而不带尾随斜杠。

我想到的一个解决方案是使用404的错误处理程序,类似于这样。(不确定这是否可行)

1
2
3
4
5
@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规则?


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

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

然后您可以使用before_request检测跟踪/的重定向。使用before_request将允许您不需要将特殊逻辑单独应用于每个路由。

1
2
3
4
5
6
7
@app.before_request
def clear_trailing():
    from flask import redirect, request

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


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

1
2
3
4
5
6
app = Flask(__name__)

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