You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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官方推荐的标准方式:

  1. 修改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)
  1. 然后修改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}"
  1. 关于APPLICATION_ROOT的补充说明
    如果你的应用是部署在反向代理后面(比如Nginx),这时候才需要配置APPLICATION_ROOT = "/api/",它的作用是让Flask知道自己的根路径是/api/,这样用url_for生成的URL会自动带上这个前缀,但它不会影响路由的注册逻辑,路由的前缀还是得靠Blueprint的url_prefix来指定。

验证

现在启动你的应用,访问http://localhost:5000/api/就能正常返回内容了,再也不用在每个路由里写死/api/啦!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 07:34:29