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
相关产品推荐
相关产品推荐

