Flask使用Blueprint为所有URL添加/api/前缀时出现404错误的问题咨询
Flask使用Blueprint为所有URL添加/api/前缀时出现404错误的问题咨询
嘿,我看你遇到的这个问题我之前也踩过坑!其实问题出在你对Flask里APPLICATION_ROOT/SCRIPT_NAME和Blueprint的url_prefix的理解偏差上,我来给你捋清楚:
首先还原下你的场景:你想给所有接口统一加/api/前缀,尝试了配置全局的SCRIPT_NAME或者APPLICATION_ROOT,但只有在路由里写死/api/才能正常访问,用/就会出现404,对吧?先看看你的项目代码:
你的项目代码
main.py
from init import app from modules.User import User app.register_blueprint(User) if __name__ == "__main__": app.run(debug=True)
init.py
from flask import Flask # 初始化应用实例 app = Flask(__name__) # 尝试配置前缀的两种方式 app.config["SCRIPT_NAME"] = "/api/" # -- OR -- app.config["APPLICATION_ROOT"] = "/api/"
modules/User.py
from flask import request, Blueprint User = Blueprint("user_blueprint", __name__) # 直接写死/api/的方式能正常访问 @User.route("/api/", methods=["GET"]) def get(): return "Called get method" # 但只写/的话访问就会404 @User.route("/", methods=["GET"]) def get(): return "Called get method"
问题根源
你用的APPLICATION_ROOT和SCRIPT_NAME这两个配置,并不是用来给Blueprint路由加前缀的!它们的主要作用是处理Flask应用部署在反向代理或者虚拟路径下的场景——比如你的应用被Nginx映射到/api路径下,这时候配置它们是为了让Flask正确生成URL和处理请求路径,但它们不会自动给每个Blueprint的路由加上前缀。
正确的解决办法
要给Blueprint下的所有路由统一加前缀,你需要在注册Blueprint的时候指定url_prefix参数,这才是Flask官方推荐的标准方式:
- 修改
main.py里的Blueprint注册代码,加上url_prefix="/api/":
from init import app from modules.User import User # 注册时指定该Blueprint的全局前缀 app.register_blueprint(User, url_prefix="/api/") if __name__ == "__main__": app.run(debug=True)
- 然后修改
modules/User.py里的路由,只需要写相对路径就行,前缀会自动带上:
from flask import request, Blueprint User = Blueprint("user_blueprint", __name__) # 现在/就对应/api/路径 @User.route("/", methods=["GET"]) def get(): return "Called get method" # 比如新增用户详情接口,写/user/<id>就会对应/api/user/<id> @User.route("/user/<int:user_id>", methods=["GET"]) def get_user(user_id): return f"Called get user method for user {user_id}"
- 关于
APPLICATION_ROOT的补充说明
如果你的应用是部署在反向代理后面(比如Nginx),这时候才需要配置APPLICATION_ROOT = "/api/",它的作用是让Flask知道自己的根路径是/api/,这样用url_for生成的URL会自动带上这个前缀,但它不会影响路由的注册逻辑,路由的前缀还是得靠Blueprint的url_prefix来指定。
验证
现在启动你的应用,访问http://localhost:5000/api/就能正常返回内容了,再也不用在每个路由里写死/api/啦!
内容来源于stack exchange
相关产品推荐
相关产品推荐

