Flask集成Swagger UI报错:Failed to load API definition求助
Flask Swagger文档加载失败问题排查
问题背景
我用Flask开发API,原有创建应用的代码如下:
def create_app(): """Create Flask app.""" app = Flask(__name__) # 允许/endpoint和/endpoint/两种URL格式 app.url_map.strict_slashes = False # 注册所有启用的蓝图 for url, blueprint in ACTIVE_ENDPOINTS: app.register_blueprint(blueprint, url_prefix=url) return app
为给API添加文档,我创建了static目录并放入swagger.json模板文件,修改create_app函数添加Swagger配置:
def create_app(): """Create Flask app.""" app = Flask(__name__) # 允许/endpoint和/endpoint/两种URL格式 app.url_map.strict_slashes = False # 注册所有启用的蓝图 for url, blueprint in ACTIVE_ENDPOINTS: app.register_blueprint(blueprint, url_prefix=url) # Swagger配置 SWAGGER_URL = "/swagger" API_URL = "/static/swagger.json" SWAGGER_BLUEPRINT = get_swaggerui_blueprint( SWAGGER_URL, API_URL, config={ "app_name": "iam-challenge-juanda" } ) app.register_blueprint(SWAGGER_BLUEPRINT, url_prefix=SWAGGER_URL) @app.route("/static/swagger.json") def specs(): return send_from_directory(os.getcwd(), "swagger.json") return app
运行应用后,访问Swagger页面时收到错误:
Failed to load API definition - Fetch error
NOT FOUND /static/swagger.json
我认为URL配置正确,请问这是什么原因?
问题原因及修复方案
1. 手动路由的路径错误
你手动添加的/static/swagger.json路由里,send_from_directory传入的是当前工作目录os.getcwd(),但swagger.json实际放在static子目录下,导致Flask在根目录找不到这个文件。
2. 无需手动定义静态文件路由
Flask默认会自动处理/static/前缀的请求,直接映射到项目根目录下的static文件夹。手动添加的路由不仅多余,还会因为路径错误覆盖默认的静态文件处理逻辑。
修复步骤
- 删除手动添加的路由代码:移除以下这段代码
@app.route("/static/swagger.json") def specs(): return send_from_directory(os.getcwd(), "swagger.json") - 确认文件位置:确保
swagger.json确实在项目根目录的static文件夹内,结构如下:你的项目/ ├── static/ │ └── swagger.json └── 你的启动文件.py - 验证配置:原有的
API_URL = "/static/swagger.json"配置是正确的,删除手动路由后,Flask会自动处理这个静态文件请求,Swagger UI就能正常加载文档了。
如果你的静态文件目录不是默认的static,可以在创建Flask实例时指定:
app = Flask(__name__, static_folder="自定义静态目录路径")
内容的提问来源于stack exchange,提问作者Juan David Serna
相关产品推荐
相关产品推荐

