一、前期回顾
前期我们day01学习接触了Django的同步与FastAPI异步区别,如何创建FastAPI项目以及如何通过路径传参传入动态参数,再通过FastAPI自带的接口文档进行测试https://blog.csdn.net/zaohuanxiang/article/details/162976300?spm=1001.2014.3001.5502
二、今日学习
今日我们学习query查询传参,请求体传参
三、query查询传参
query查询传参相比path路径传参区别在于,path路径传参是在于通过路径进行动态传参,query查询传参是在于通过URL中后面以键值对的组合传递参数
# 测试路由通过路径参数访问 @app.get('/path/{id}') # 路径动态传参 async def path_api(id:int): return {'code':200, 'msg':'ok', 'data':id} # 测试路由通过查询参数访问 @app.get('/query') async def query_api(id:int): return {'code':200, 'msg':'ok', 'data':id}测试结果:
path路径传参:
query查询:
可以看出在url中两种方式的不同,在path路径传参时后面直接跟着传递的参数,而在query查询参数中是?的后面跟着id的参数,路径传参时需要注意路径动态传参时的参数,要与函数名小括号内的参数保持一致
在昨天我们学习到路径传参时,在函数名的括号中通过在定义的函数名中可以使用Path类,来做一些限制或者校验,而在查询参数也通过Query进行传参,
使用query是记得导包
from fastapi import Query四、请求体传参
以上为查询参数,现在我们知道了什么为路径参数和查询参数,接下来我们学习请求体参数
之前所学的路径参数和查询参数,都有明显的局限性:
比如路径传参,只能传简单的值(id、名称),且长度有限,而查询参数,不适合传递用户信息或者商品详情等,隐私性较高的参数,所有我们接下来要学的请求体参数就可以解决前面的问题
关键前提:请求体与 HTTP 方法
请求体通常与「非查询类」HTTP 方法配合使用(符合 RESTful 规范):
- POST:创建资源(如用户注册、新增商品)→ 必用请求体
- PUT:全量更新资源(如修改商品所有信息)→ 必用请求体
- PATCH:部分更新资源(如修改商品价格)→ 常用请求体
- GET:查询资源 → 禁止使用请求体(不符合 HTTP 规范)
1、了解Pydantic
何为Pydantic:
Pydantic 是 Python 的「数据验证库」,也是 FastAPI 的核心依赖之一,主要作用:
- 定义结构化数据模型(如请求体的字段、类型、约束)
- 自动校验输入数据(类型、范围、格式等)
- 自动序列化 / 反序列化(JSON ↔ Python 对象)
- 自动生成接口文档(字段描述、示例值等)
FastAPI 的请求体参数,本质是「基于 Pydantic 模型定义的数据结构」,框架会自动完成:
- 解析请求体的 JSON 数据
- 按模型规则校验数据
- 校验通过:将 JSON 转为 Python 对象传递给路由函数
- 校验失败:返回标准化 422 错误
2、基础请求体的实现
首先我们需要先在控制台导入依赖
pip install pydantic1、导入核心包
from fastapi import FastAPI from pydantic import BaseModel # 必须继承BaseModel才能实现数据校验 import uvicorn2、创建一个FastAPI实例
app = FastAPI( title='FastAPI请求体教程', description='FastAPI请求体教程描述', version='0.1.0', )3、定义Payload模型
# 定义Payload模型 class Payload(BaseModel): #定义字段 username:str password:str email:str age:int phone:str4、定义路由、接收Payload模型并返回响应数据
@app.post('/payload') async def payload(payload: Payload): return {'code':200, 'msg':'请求成功', 'data':{ 'username':payload.username, 'password':payload.password, 'email':payload.email, 'phone':payload.phone, }} if __name__ == "__main__": uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)5、测试接口
可以看到测试结果,code返回200,msg请求成功,并且成功返回了在前端传入的参数
以上为简单模拟测试请求体传参,我们还可以在定义字段中,通过Field里面传入参数对字段进行校验,Field记得到导包
from pydantic import BaseModel, Field
class Payload(BaseModel): #定义字段 username:str=Field( title='用户名', description='用户名描述', min_length=4, max_length=20, example='admin' ) password:str=Field( title='密码', description='密码描述', min_length=6, max_length=20, pattern=r'^\S{6,20}$', example ='123456' ) email:str=Field( title='邮箱', description='邮箱描述', min_length=6, max_length=20, pattern=r'^[a-zA-Z0-9_]{2,20}@[a-zA-Z0-9]{1,10}\.[a-zA-Z0-9]{1,5}$', example='123456789@qq.com' ) phone:str=Field( title='手机号', description='手机号描述', min_length=11, max_length=11, pattern=r'^1[3456789]\d{9}$', example='13812341234' )6.总结
本文是 FastAPI 学习系列的第二篇,在回顾了 Day01 同步/异步区别及路径传参的基础上,重点讲解了Query 查询传参与Request Body 请求体传参的核心用法。
Query 查询传参 vs Path 路径传参
- Path:参数嵌入 URL 路径中(如
/path/{id}),适用于资源定位,需配合Path类进行校验。 - Query:参数以键值对形式拼接在 URL
?之后(如/query?id=1),适用于筛选、分页等场景,需导入并使用Query类进行约束。 - 注意:无论哪种方式,URL 中的参数名必须与函数定义的形参名保持一致。
- Path:参数嵌入 URL 路径中(如
请求体(Request Body)传参
- 适用场景:解决了路径和查询参数在数据长度、隐私性及结构化方面的局限。遵循 RESTful 规范,主要用于
POST(创建)、PUT(全量更新)、PATCH(部分更新),严禁用于 GET 请求。 - 核心依赖 Pydantic:FastAPI 通过 Pydantic 实现数据模型的自动解析、校验、序列化及接口文档生成。校验失败会自动返回标准的 422 错误。
- 适用场景:解决了路径和查询参数在数据长度、隐私性及结构化方面的局限。遵循 RESTful 规范,主要用于
Pydantic 模型与 Field 高级校验
- 基础用法:继承
BaseModel定义数据结构,FastAPI 自动将 JSON 转为 Python 对象。 - Field 增强:通过
Field()对字段进行精细化控制,支持设置标题、描述、长度限制(min_length/max_length)、正则匹配(pattern)及示例值(example),显著提升接口文档的可读性和数据安全性。
- 基础用法:继承