FastAPI 自动生成 OpenAPI 文档但需注意导出、定制与安全:应调用 app.openapi() 写入文件,初始化时传入 title/version/servers/tags,禁用文档需设 openapi_url=None 或加鉴权,字段描述须用 Field/Path/Query 显式声明。

FastAPI 默认就生成 OpenAPI 文档,不需要额外插件或手动写 YAML —— 只要你的路由函数带类型注解、请求体用 BaseModel,/openapi.json 就会自动输出标准 JSON Schema。但“自动生成”不等于“开箱即用”,真正落地时容易卡在导出路径、字段描述、生产安全这几个点上。
导出 OpenAPI JSON 文件到本地磁盘
你不能靠浏览器右键另存为 /openapi.json 来获取稳定版本:它每次启动都动态生成,且可能含调试信息(比如 x-swagger-router-controller 这类非标准字段)。正确做法是启动后主动调用 app.openapi() 获取字典,再写入文件:
- 确保应用已初始化完成(不能在
app = FastAPI()后立刻调用app.openapi(),得等所有@app.get注册完) - 推荐放在
if __name__ == "__main__":块末尾,或单独写个export_openapi.py脚本 - 示例代码片段:
import json
from main import app # ← 确保这里导入的是已注册全部路由的 app 实例
<p>with open("openapi.json", "w") as f:
json.dump(app.openapi(), f, indent=2)</p>
注意:app.openapi() 返回的是 dict,不是字符串;别漏掉 indent=2,否则生成的 JSON 不可读。
定制 OpenAPI 元数据:title / version / servers / tags
这些字段直接影响 /openapi.json 内容和 Swagger UI 顶部显示,必须在 FastAPI() 初始化时传入,而不是后期 patch:
-
title和version是必填项,否则 Swagger UI 显示 “Untitled API” -
servers列表控制文档页右上角的环境切换下拉框,例如:servers=[{"url": "https://api.example.com/v1", "description": "Production"}] -
tags用于分组接口,需配合路由装饰器的tags=["users"]使用,否则不生效 - 错误做法:改
app.openapi_schema字段 → 它是只读缓存,下次调用app.openapi()会重新覆盖
禁用文档 ≠ 隐藏接口定义
设 docs_url=None 只会让 /docs 返回 404,但 /openapi.json 依然可访问 —— 攻击者用 curl 就能拿到完整接口结构。真要收敛暴露面,得组合操作:
- 仅设
docs_url=None+redoc_url=None:UI 界面消失,/openapi.json仍存在 - 彻底禁用 OpenAPI 输出:加
openapi_url=None,此时app.openapi()会返回{},所有文档相关路径均 404 - 更稳妥的做法:保留
/openapi.json,但加中间件鉴权,例如只允许内网 IP 或带特定 header 访问
让请求体字段显示 description 和 example
Pydantic 模型字段默认不带说明文字,Swagger UI 里就只显示 string、integer 这种泛泛而谈的类型。要补全,必须显式用 Field 或 Alias 注入元信息:
- 路径/查询参数:用
Path(description="用户ID")、Query(description="页码") - 请求体字段:在
BaseModel中用Field(description="密码长度至少6位", min_length=6) - example 值要写进
Field(..., example="abc123"),不能只靠模型默认值(FastAPI 不自动把默认值当 example) - 如果用了
Union[ItemA, ItemB]多态体,记得给每个子模型也加Config.schema_extra补example,否则 Swagger UI 里只显示空 object
最常被忽略的一点:所有字段级描述最终都编译进 /openapi.json 的 schema.properties.xxx.description 路径里。导出后直接搜 description 就能验证是否生效。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











