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

如何为已带URL前缀的Flask蓝图添加统一前缀?

Flask 蓝图统一添加版本前缀的优化方案

方案1:使用蓝图嵌套(Flask 2.0+ 推荐)

Flask 2.0及以上支持蓝图嵌套,你可以创建一个顶层的版本蓝图,再将所有业务蓝图注册到这个版本蓝图上,最后把版本蓝图注册到app。子蓝图的前缀会自动继承父蓝图的版本前缀,无需手动拼接。

实现步骤:

  1. 创建版本父蓝图(例如在api/__init__.py中):
from flask import Blueprint

v1_bp = Blueprint('v1', __name__, url_prefix='/v1')
  1. 在业务蓝图模块中,将蓝图注册到父蓝图而非直接注册到app:
    比如user.py:
from flask import Blueprint
from . import v1_bp

user_bp = Blueprint('user', __name__, url_prefix='/user')

@user_bp.route('/profile')
def get_profile():
    return {"msg": "user profile"}

# 将user蓝图注册到v1父蓝图
v1_bp.register_blueprint(user_bp)

同理track.py:

from flask import Blueprint
from . import v1_bp

track_bp = Blueprint('track', __name__, url_prefix='/track')

@track_bp.route('/list')
def get_track_list():
    return {"msg": "track list"}

v1_bp.register_blueprint(track_bp)
  1. 在应用工厂中注册版本父蓝图:
def create_app():
    app = Flask(__name__)
    
    from .api import v1_bp
    app.register_blueprint(v1_bp)
    
    return app

优点:版本前缀与业务路由解耦,后续新增v2版本只需复制一套父蓝图结构,扩展性极强;代码结构清晰,符合模块化设计。

方案2:集中配置+统一注册

如果不想用蓝图嵌套,可以在应用工厂中集中管理版本前缀,统一拼接后注册蓝图,避免在每个模块中重复处理。

实现步骤:

  1. 在配置文件(比如config.py)中定义版本前缀:
API_VERSION_PREFIX = '/v1'
  1. 在应用工厂中统一注册蓝图,自动拼接前缀:
def create_app(config_name='development'):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    version_prefix = app.config['API_VERSION_PREFIX']
    
    from .user import user_bp
    from .track import track_bp
    from .weather import weather_bp
    
    app.register_blueprint(user_bp, url_prefix=f"{version_prefix}/user")
    app.register_blueprint(track_bp, url_prefix=f"{version_prefix}/track")
    app.register_blueprint(weather_bp, url_prefix=f"{version_prefix}/weather")
    
    return app

优点:所有蓝图的版本前缀集中管理,修改版本号只需改配置文件;业务模块无需关心版本前缀,专注于自身路由逻辑。

方案3:自定义注册工具函数

如果已有大量蓝图注册代码,不想大范围修改,可以封装一个工具函数,自动处理版本前缀的拼接:

实现步骤:

  1. 编写工具函数(例如在utils.py中):
def register_versioned_blueprint(app, blueprint, sub_prefix, version_prefix='/v1'):
    full_prefix = f"{version_prefix}{sub_prefix}"
    app.register_blueprint(blueprint, url_prefix=full_prefix)
  1. 在应用工厂中使用该函数注册蓝图:
def create_app():
    app = Flask(__name__)
    
    from .user import user_bp
    from .track import track_bp
    from .utils import register_versioned_blueprint
    
    register_versioned_blueprint(app, user_bp, '/user')
    register_versioned_blueprint(app, track_bp, '/track')
    
    return app

优点:对现有代码侵入性小,只需替换注册方式即可;可以灵活调整版本前缀(比如从配置读取)。


内容的提问来源于stack exchange,提问作者joepaji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 16:01:30