当前位置: 首页 > news >正文

FastAPI 新手入门第 8 篇:让 /docs 更像一份 API 文档

上一篇我们用APIRouter把接口拆到了不同文件里。代码变清楚了,但打开/docs时,接口还是一排排堆在那里。

这一篇我想把/docs往前再推一步:给接口分组,加上简短说明。做完后,itemsuserssystem会分开显示,点开接口时也能知道这个接口用来做什么。

先把接口分组

现在项目里有三个路由文件:

app/routers/ items.py users.py health.py

我希望/docs里也按这三类来展示。最小改动是在APIRouter上加tags

items.py只看这一行:

fromfastapiimportAPIRouter router=APIRouter(prefix="/items",tags=["items"])

这里顺手把prefix="/items"也放到了路由上。这样文件里的接口就不用反复写/items

@router.get("",response_model=list[ItemPublic])deflist_items():...@router.get("/{item_id}",response_model=ItemPublic)defread_item(item_id:int):...

最后生成的路径仍然是:

GET /items GET /items/{item_id}

只是/items这段公共路径被放到了APIRouter上。

users.py也一样:

router=APIRouter(prefix="/users",tags=["users"])

health.py不需要路径前缀,只加分组:

router=APIRouter(tags=["system"])

保存后重启服务,打开:

http://127.0.0.1:8000/docs

这时接口会按itemsuserssystem分开。读接口的人不用从一长串列表里猜哪些接口属于同一块。

给接口加一句说明

分组解决的是“接口放在哪里”。点开接口后,还要让人知道“这个接口干什么”。

FastAPI 的路径操作可以直接加summarydescription

@router.get("/{item_id}",response_model=ItemPublic,summary="获取单个商品",description="根据商品 ID 查询商品。商品不存在时返回 404。",)defread_item(item_id:int,token:str=Depends(get_token_header)):ifitem_idnotinfake_items_db:raiseHTTPException(status_code=404,detail="Item not found")returnfake_items_db[item_id]

重点看summarydescriptionsummary是接口列表里那句短说明,description是点开接口后展示的详细说明。

我会把summary写短,把description写成读者能直接用的信息。比如“不存在时返回 404”比“用于查询商品资源”更有用。

POST /items也加上说明:

@router.post("",response_model=ItemPublic,summary="创建商品",description="接收创建商品需要的字段,服务端会补上 ID 和内部字段。",)defcreate_item(item:ItemCreate,token:str=Depends(get_token_header)):...

这句说明也给后面的第 10 篇埋了一个点:创建请求里只传业务输入,服务端会补一些内部字段,但响应里不会全部暴露。

给分组本身加说明

接口能分组之后,还可以给每个分组加说明。这部分放在main.py里:

openapi_tags=[{"name":"items","description":"商品相关接口,用来练习列表、查询和创建。",},{"name":"users","description":"用户相关接口,目前只保留最小查询示例。",},{"name":"system","description":"系统状态接口,用来检查服务是否正常。",},]app=FastAPI(title="FastAPI Beginner Lab",openapi_tags=openapi_tags,)

openapi_tags里的name要和前面tags=["items"]里的名字一致。名字对上后,/docs才知道这段说明属于哪个分组。

刷新/docs,每个分组下面会出现对应描述。

/docs不是给别人看的摆设

我以前刚接触自动文档时,会把它当成“框架附赠的页面”。写一段时间后才发现,/docs对新手最有用的地方不是好看,而是能帮我们确认三件事:

  • 路径有没有挂上去:接口没出现在/docs,大概率是路由没注册。
  • 参数有没有被识别:请求头、查询参数、请求体会直接显示出来。
  • 返回结构是否符合预期:响应模型会影响文档里的响应说明。

所以我会在每次改路由后打开/docs看一眼。它不是最终给产品经理看的完整接口文档,但在开发阶段很省事。

动手改一下

/health接口加上summary,并把它放进system分组。

app/routers/health.py可以这样写:

fromfastapiimportAPIRouter router=APIRouter(tags=["system"])@router.get("/health",summary="查看服务状态",description="返回服务是否可用。",)defhealth_check():return{"status":"ok"}

保存后刷新/docs。如果/health出现在system分组里,并且点开后能看到“查看服务状态”,这篇就算学完。


到这里,这篇的目标已经完成:

  • 我们用tags把接口按itemsuserssystem分组。
  • 我们用summarydescription给接口补了说明。
  • 我们知道了/docs可以用来检查路由、参数和响应结构。

本文代码:https://github.com/tanghaojin/fastapi-beginner-lab/tree/article-08-docs-metadata

下一篇解决另一个问题:配置不要写死在代码里,用环境变量来管理项目配置。

参考资料

  • FastAPI Metadata and Docs URLs: https://fastapi.tiangolo.com/tutorial/metadata/
  • FastAPI Path Operation Configuration: https://fastapi.tiangolo.com/tutorial/path-operation-configuration/
http://www.jsqmd.com/news/1132443/

相关文章:

  • 【 CLI与GUI两种AI编程范式技术解析】终端Agent与可视化IDE架构对比
  • ClaudeCode Skills:IDE内可工程化的AI编程技能体系
  • 从 Agent Memory 到 Object-Scoped Context 的思考
  • !ccstatusline:让你的 Claude Code 状态栏直接封神!
  • 华为防火墙Web登录配置:eNSP环境搭建与安全策略详解
  • JQuery Tips(4)----一些关于提高JQuery性能的Tips
  • 软件:STM32-F1系列-存储器映像(2026/7/5)
  • 基于自然语言的软件工程和程序设计(中)
  • AI模型安全测试革命:从手工POC到自动化Fuzz框架的工程实践
  • GitHub Copilot 实战指南:结对编程式AI辅助开发核心逻辑与7大高频场景
  • 新手流量池实战:从零搭建你的第一个桌面自动化工作流
  • 判断dll是debug还是release,这是个问题
  • SpringBoot JUnit 教程
  • Qt界面底层实现浅谈: 多渲染后端的分层架构
  • CAF 与 PDAF 监控机制对比:从 3 种检测逻辑到触发条件差异分析
  • 126、DyHead 动态检测头替换 YOLOv11 Head:Scale+Space+Task 三维注意力的实现
  • 宝鸡装修必看:安柏特全屋定制厂环保板材解析
  • 视频孪生时空感知技术详解
  • C# 基础入门指南:从零开始学习 C# 编程
  • XCA开源证书管理:如何用现代工具解决传统PKI难题
  • 【译】组织好你的Asp.Net MVC解决方案
  • 实战指南:如何将微信聊天记录转化为个人AI训练数据资产
  • NHibernate Issues之1255:联合主键(composite-id)
  • 该如何进行WPF界面设计
  • o1-preview在机器学习项目中的协同建模实战
  • 6款主流AI智能降重工具 降痕效果拉满
  • Claude Code Review实战:AI驱动的自动化代码审查部署与优化指南
  • 【Bug已解决】Claude Team Plan 购买席位报错 Payment failed 解决方案
  • 从 Demo 到可上线:一个游戏智能客服 RAG 系统的工程化拆解
  • 修改网口MTU说明