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

FastAPI 进阶:教你 APIRouter 模块化与 Pydantic 实战

前面的笔记我们快速过了一遍 FastAPI ,这篇开始将开始细分学习常用的两块内容:路由组织 和 请求体。

在实际开发当中,会遇到两个头疼的问题:

  • 代码堆积: 所有的 API 都写在 main.py 里,几百行后根本找不到代码。

  • 数据混乱: 前端传来的 JSON 格式不对

今天这篇内容,就是为了解决这两个痛点:APIRouter(路由组织) 与 Pydantic(请求体校验)。

文章目录

APIRouter(路由)

一、使用 APIRouter 模块化

当你的项目包含用户、订单、商品等多个模块时,APIRouter 就是你的“收纳盒”。

1、推荐的项目结构

project/
├── main.py # 程序入口,负责挂载路由
├── routers/ # 存放各个模块的逻辑
│ ├──init.py
│ ├── user.py # 用户相关接口
│ └── item.py # 商品相关接口
└── schemas/ # 存放数据模型(Pydantic Models)

2. 编写模块化路由(main.py)

main.py是整个项目的入口文件,所有的请求都会先经过这里,只负责初始化和路由挂载
利用 ** prefix** 和** tags ** 参数,可以极大地减少重复工作:

fromfastapiimportFastAPI# 导入路由fromaps.Usersimporturls# 1. 初始化路由器app.include_router(urls.api_router,prefix="/users",tags=["用户管理"])

tags参数的体现如下图箭头所指:

3. 业务分流

在 分流文件当中,不使用 app = FastAPI(),而是使用 api_router = APIRouter()。这样,这一组 API 就可以像插件一样,随时插拔到主程序上。

fromfastapiimportAPIRouter# 路由干三件事:路由 = “网址 → 函数”的映射表# 看路径(/users /login)# 看请求方式(GET / POST)# 决定调用哪个函数# 创建路由api_router=APIRouter()# 创建功能函数(增删改查)# 省略了/users 是因为在main函数中,路由已经定义了@api_router.get('/{id}')asyncdefget_user(id:int):return{'id':id,'name':'张三'}

二、Pydantic(请求体校验)

在这里补充一个表格:

操作方法
查找GET
新增POST
全改PUT
局部改PATCH
删除DELETE

在处理** POST** 请求时,如果字段太多,用路径参数显然不现实。这时我们需要 Pydantic 模型来定义数据规范。

1、定义数据模型

实战代码实现:

frompydanticimportBaseModel# Pydantic模型:定义数据模型,进行数据验证和序列化classUser(BaseModel):name:strage:intsalary:floattelephone:str@api_router.post('/add')# 这个异步函数的作用是添加用户,接收一个User对象作为参数,这个User对象会自动进行数据验证,如果数据不符合要求,会返回一个错误信息asyncdefadd_user(user:User):print(user)return{'name':user.name,'age':user.age,'salary':user.salary,'telephone':user.telephone,'message':'添加成功'}

2、测试方法(用 Swagger 或 Yaak):

方法:POST
路径:/add

FastAPI 会自动校验:
name、age、salary、telephone必须有
age 必须是整数
假如age传入的参数并非整数,则返回422错误并且打印哪里错了。如下图:

当然,传入的参数有其他错误时,也会报422错误。

3、Union类型

Union类型在Fastapi里边使用时,表示可以接受多种类型的参数

fromtypingimportUnion# 而下面具体的函数里面定义了两个参数,name和age,name是路径参数,age是查询参数@api_router.get('/search/{name}')asyncdefadd_user(name:str,age:Union[int,None]=None):print(name,age)return{'name':name,'age':age}

上述使用到的Union则是表示,age参数的数据类型可以是int,也可以是None,并且默认是None。
而现在多用以下这种表达形式:

@api_router.get('/search/{name}')asyncdefadd_user(name:str,height:float|None=None):print(name,height)return{'name':name,'height':height}

4、嵌套模型

假如用户里有地址,只需要多定义一个Address类:

classAddUser(BaseModel):street:strfloor:intclassUser(BaseModel):name:strage:intsalary:floattelephone:straddress:AddUser

这篇就先写到这里,内容聚焦在路由组织 + 请求体基础,部分代码是伪代码,运行时还需仔细辨别。

http://www.jsqmd.com/news/639688/

相关文章:

  • 逆向归纳法实战:从海盗分金到子博弈精炼Nash均衡
  • 【深度解析】苏州工业机器人培训:核心内容与就业指南 - 速递信息
  • Qwen3字幕系统应用场景:清音刻墨助力法律庭审录音自动生成笔录时间轴
  • 2026年4月工业内窥镜手持式与防爆型推荐——哪家可定制特殊工况检测设备? - 品牌推荐大师1
  • python编程语法基础笔记(4.13)(网络编程)
  • Local SDXL-Turbo实战教程:用‘cyberpunk style, 4k, realistic’生成高清海报
  • 百度网盘免会员下载加速终极指南:三步实现满速下载
  • Shadcn-Vue终极指南:3个技巧打造专业级Vue组件库应用
  • 20N50 -ASEMI大电流场景的性能新标杆20N50
  • 2026年汽车电瓶栓、汽车连接器、保险盒口碑推荐榜单:浙江大欧电子车规级配套选型指南 - 海棠依旧大
  • FireRedASR-AED-L在MATLAB环境下的调用与性能分析
  • 2026活动小程序开发公司怎么选?麦冬科技提供定制方案(附带联系方式) - 品牌2025
  • 为什么你的文本文件总显示乱码?EncodingChecker 编码检测工具深度解析
  • 如何用Unlock Music Electron轻松解密加密音乐文件:终极完整指南
  • 基于单片机的智能家居门铃系统设计
  • 弦音墨影快速上手指南:3步启动视频理解系统,支持自然语言提问
  • 2026年4月药用级羟乙基纤维素与壳聚糖的供应选择解析 - 品牌推荐大师1
  • **发散创新:基于FFmpeg的视频编码优化实践与实战代码解析**在现代多媒
  • 2026社媒获客公司推荐:助力企业精准触达目标客户 - 品牌排行榜
  • 盘点2026年唐家、金湾、横琴别墅全屋定制公司,选哪家比较靠谱 - 工业品牌热点
  • 2026年洛阳江浙菜宴请完全指南:诱江南官方电话+4大品牌深度横评+避坑清单 - 精选优质企业推荐榜
  • Excel-Agent实测:这款AI做表工具,让我彻底告别了vlookup
  • STM32程序烧录成功但跑不起来?别急着怀疑人生,先检查这3个硬件配置(附BOOT引脚详解)
  • 成都别墅装修公司哪家口碑好?附2026最新排名推荐及避坑注意事项(含价格参考) - 成都人评鉴
  • 密封胶市场口碑分析:2026年哪些厂家值得关注?密封胶供应商立通诚信务实提供高性价比服务 - 品牌推荐师
  • 梳理婚礼舞台布置制造企业,哪家性价比高值得推荐 - 工业品网
  • [T.4]团队作业:选题和需求分析
  • 如何快速掌握AriaNg:提升下载效率的终极Web界面解决方案
  • Lyft 2026 面经|从 OA 到 VO 全流程真实分享
  • 显卡从 3060 到 5090 变化最大的是哪几款 性价比比较高的哪几个