以下是针对 FastAPI 无法加载 Swagger 文档(`Failed to load API definition`)的常见解决方案:
---
### 1. 检查 OpenAPI 文档是否生成
直接访问 OpenAPI 的 JSON 文件地址,确认是否能正常返回数据:
bash
# 默认地址为 /openapi.json
http://localhost:8000/openapi.json
- ✅ 正常:返回 JSON 格式的 API 文档
- ❌ 异常:检查代码逻辑或依赖
---
### 2. 常见原因及修复
#### 原因 1:路由定义错误
- **表现**:路由中存在语法错误或未正确注册。
- **修复**:
python
from fastapi import FastAPI
app = FastAPI()
@app.get("/") # 确保路由装饰器正确使用
def read_root():
return {"Hello": "World"}
---
#### 原因 2:CORS 限制
- **表现**:浏览器控制台提示跨域错误。
- **修复**:添加 CORS 中间件:
python
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 生产环境建议限制来源
allow_methods=["*"],
allow_headers=["*"],
)
---
#### 原因 3:依赖项未正确注入
- **表现**:路由依赖的组件(如数据库连接)未初始化。
- **修复**:检查依赖项是否正常启动,避免阻塞主线程。
---
#### 原因 4:JSON 序列化问题
- **表现**:Pydantic 模型或返回值包含不可序列化对象(如 `datetime`)。
- **修复**:添加自定义 JSON 编码器:
python
from datetime import datetime
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
app = FastAPI()
@app.get("/data")
def get_data():
data = {"time": datetime.now()}
return jsonable_encoder(data) # 显式转换
---
#### 原因 5:中间件干扰
- **表现**:自定义中间件修改了响应内容。
- **修复**:检查中间件逻辑,确保不干扰 `/openapi.json` 路径。
---
### 3. 其他排查步骤
1. **重启服务**:确保代码修改已生效。
2. **查看日志**:检查服务启动时的错误日志。
3. **验证端口占用**:确认端口未被其他进程占用。
4. **浏览器缓存**:尝试无痕模式访问 `http://localhost:8000/docs`。
---
### 示例代码(最小化验证)
python
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"status": "OK"}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
---
通过上述步骤逐步排查,通常可解决 Swagger 文档加载失败的问题。如果问题仍存在,建议提供具体错误日志进一步分析。