如何让Flask的redirect重定向相对于应用根路径,是否支持传入endpoint?
子路径部署下的重定向问题解决
问题原因
你遇到的跳转路径错位问题,根源是硬编码路径没有适配Flask的子路径部署场景:
- 以
/开头的绝对路径会直接从域名根目录开始计算,自动跳过应用部署的子路径前缀 - 不带前缀的相对路径会基于当前请求的路径拼接,所以会出现在深层路径后追加跳转路径的问题
解决方案
你只需要两步就能实现符合预期的跳转:
- 先配置Flask应用的子路径前缀
在应用初始化时添加APPLICATION_ROOT配置,声明应用部署的子路径:
app = Flask(__name__) app.config["APPLICATION_ROOT"] = "/test"
如果是用Nginx等反向代理部署,还要同步配置代理透传SCRIPT_NAME参数,值和上面的/test保持一致即可。
- 跳转时用
url_for()生成路径,不要硬编码url_for()会自动读取APPLICATION_ROOT配置,生成带前缀的完整应用内路径,再传给redirect()就不会出现路径错误:
# 假设登录路由的endpoint是login redirect(url_for("login"))
全局未登录拦截实现
你需要的全局未登录跳转逻辑直接用before_request钩子就能实现,不需要逐个路由加判断:
from flask import request @app.before_request def auth_check(): # 排除登录路由本身,避免无限重定向 if request.endpoint != "login" and not 你的登录态判断逻辑(): return redirect(url_for("login"))
redirect能否直接传入endpoint
不能。redirect()方法只接收URL字符串、相对路径或者合法的响应对象作为参数,不支持直接传入endpoint。
官方推荐的做法就是先用url_for("endpoint名称")将endpoint转换为对应的路径字符串,再传给redirect(),这种写法也避免了后续修改路由路径还要同步改硬编码跳转的维护问题。
内容的提问来源于stack exchange,提问作者DreamingJ
相关产品推荐
相关产品推荐

