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

Flask Restplus多蓝图Swagger合并问题:仅显示首个注册蓝图文档

解决Flask Restplus多蓝图Swagger文档合并问题

这个问题的核心原因是你为每个蓝图创建了独立的Api实例,每个Api实例都会生成自己的Swagger规范和UI路由。当两个蓝图没有设置url_prefix时,它们的Swagger UI默认路由(根路径/)会互相覆盖,导致只有最后注册的那个Api的文档被展示,而接口本身因为路由不同(/base和/bff)所以能正常响应。

要合并两个蓝图的Swagger文档,你需要改用**Namespace(命名空间)**来拆分接口,而不是创建多个Api实例。Namespace可以让你把不同模块的接口归类,同时统一注册到同一个主Api实例中,最终生成一个合并的Swagger文档。

修改后的完整代码如下:

from flask import Blueprint, Flask
from flask_restplus import Api, Resource, Namespace

# 初始化Flask应用
app = Flask(__name__)

# 创建主Api实例,这是唯一的Swagger文档入口
api = Api(app, title='Combined API', version='1.0', description='合并Base和BFF接口的Swagger文档')

# 创建蓝图,可根据需求设置url_prefix区分路由前缀
base_api_blueprint = Blueprint('base_api', __name__)
bff_api_blueprint = Blueprint('bff_api', __name__)

# 创建命名空间,并关联对应的蓝图
base_ns = Namespace('base', description='Base模块接口', blueprint=base_api_blueprint)
bff_ns = Namespace('bff', description='BFF模块接口', blueprint=bff_api_blueprint)

# 将命名空间注册到主Api
api.add_namespace(base_ns)
api.add_namespace(bff_ns)

# 在命名空间下定义资源
@base_ns.route('/base', endpoint='base-endpoint')
class BaseResource(Resource):
    def get(self):
        return {"from":"base"}

@bff_ns.route('/bff', endpoint='bff-endpoint')
class BffResource(Resource):
    def get(self):
        return {"from":"bff"}

# 注册蓝图到应用
app.register_blueprint(base_api_blueprint)
app.register_blueprint(bff_api_blueprint)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080, debug=True)

关键修改点说明:

  • 只保留一个主Api实例绑定到Flask app,作为统一的Swagger文档入口。
  • 用Namespace替代原来的独立Api实例,每个Namespace关联对应的蓝图,实现模块拆分。
  • 将所有Namespace注册到主Api,这样所有接口都会被整合到同一个Swagger文档中。
  • 资源路由现在通过@<namespace>.route()装饰器定义,而不是原来的@<api>.route()。

现在访问http://localhost:8080/,就能看到包含Base和BFF两个模块所有接口的合并Swagger文档了,同时两个接口依然能正常响应请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:19:11