Flask路由中的斜线后缀

2024-04-28 13:37:51 发布

您现在位置:Python中文网/ 问答频道 /正文

以下面两条路线为例。

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/"

我想看到的行为是第二种情况下的逆行为。e、 g."/someplace/"将重定向到"/someplace",而不是相反。有没有办法定义采取这种行为的路线?

根据我的理解,strict_slashes=False可以在路由上设置,以有效地获得案例2在案例1中的相同行为,但我想做的是使重定向行为始终重定向到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规则?


Tags: pathapp路由requestdef情况route重定向
2条回答

如果您希望两条路线的处理方式相同,我将执行以下操作:

app = Flask(__name__)

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

您正在使用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])

相关问题 更多 >