FastAPI系列(07):请求体数据
本系列汇总,请查看这里:https://www.cnblogs.com/uncleyong/p/19503695
官网
https://fastapi.tiangolo.com/tutorial/body/
下面用到的是pydantic模块
from pydantic import BaseModel, Field, field_validator
请求体数据
定义
参数类型为继承 Pydantic 模块的`BaseModel`类的数据模型类,则它将被解释为请求体参数。
和声明查询参数时一样,当一个模型属性具有默认值时,它不是必需的。否则它是一个必需属性。将默认值设为 None 可使其成为可选属性。
FastAPI 会自动将定义的模型类转化为JSON Schema,Schema 成为 OpenAPI 生成模式的一部分,并显示在 API 交互文档中,查看 API 交互文档如下,该接口将接收application/json类型的参数。
示例
from fastapi import FastAPI
import uvicorn
from typing import List
from pydantic import BaseModel
from datetime import date
app = FastAPI()
class User(BaseModel):
name: str
age: int
birth: date
friends: List[int]
@app.post("/user")
def create_user(user:User): # 形参名可以随意,但是类型必须是User
print(user)
print(type(user))
print(user.name)
print(user.model_dump()) # 对象转换为字典
return user # 直接返回对象,会自动被序列化为json字符串
if __name__ == '__main__':
uvicorn.run("request_body:app", port=8002, reload=True)
接口文档

请求数据

直接返回对象,会自动被序列化为json字符串

控制台输出内容:

添加默认值
from fastapi import FastAPI
import uvicorn
from typing import List
from pydantic import BaseModel,Field
from datetime import date
app = FastAPI()
class User(BaseModel):
name: str= "韧"
age: int = 18
birth: date | None = None
friends: List[int] = []
@app.post("/user")
def create_user(user:User): # 形参名可以随意,但是类型必须是User
return user # 直接返回对象,会自动被序列化为json字符串
if __name__ == '__main__':
uvicorn.run("request_body:app", port=8001, reload=True)
访问接口文档

接口文档

请求数据

响应结果

属性没有给默认值的是必填
name没有默认值
class User(BaseModel):
name: str
age: int = 18
birth: date | None = None
friends: List[int] = []
接口文档

请求数据,不传name

响应报错

添加约束
数字约束
from fastapi import FastAPI
import uvicorn
from typing import List
from pydantic import BaseModel,Field
from datetime import date
app = FastAPI()
class User(BaseModel):
name: str = "韧"
age: int = Field(default=18,gt=0,lt=120,title="年龄",description="年龄0-120")
birth: date | None = None
friends: List[int] = []
@app.post("/user")
def create_user(user:User): # 形参名可以随意,但是类型必须是User
return user # 直接返回对象,会自动被序列化为json字符串
if __name__ == '__main__':
uvicorn.run("request_body:app", port=8001, reload=True)
请求数据,age不符合要求

响应报错

字符串约束
name: str = Field(pattern="^a") # name必须a开头
接口文档,以及默认填入了a

请求参数

错误响应

name: str = Field(pattern="^[A-Z][A-Za-z0-9]{4,6}$",title="用户名",description="大写字母开头,用户名4-6位")
接口文档,name自动生成符合规则的

定义方法校验
类中也可以写一个方法来对某个属性做校验,这样很灵活
from fastapi import FastAPI
import uvicorn
from typing import List
from pydantic import BaseModel, Field, field_validator
from datetime import date
app = FastAPI()
class User(BaseModel):
# name: str = Field(pattern="^[A-Z][A-Za-z0-9]{4,6}$",title="用户名",description="大写字母开头,用户名4-6位")
# name: str = Field(pattern="^a") # name必须a开头
name : str
age: int = Field(default=18,gt=0,lt=120,title="年龄",description="年龄0-120")
birth: date | None = None
friends: List[int] = []
@field_validator('name')
@classmethod
def name_must_alpha(cls, v):
assert v.isalpha(), 'name must be alpha' # 如果未false,会抛出后面的错误信息name must be alpha
if len(v) < 3 or len(v) > 5:
raise ValueError('用户名长度不能小于3大于5')
return v
@app.post("/user")
def create_user(user:User): # 形参名可以随意,但是类型必须是User
return user # 直接返回对象,会自动被序列化为json字符串
if __name__ == '__main__':
uvicorn.run("request_body:app", port=8001, reload=True)
说明:如果不加@classmethod会报错,pydantic.errors.PydanticUserError: `@field_validator` cannot be applied to instance methods
- @field_validator 是 Pydantic(主要是 v2 版本)中用于验证模型字段的装饰器,它的设计初衷是作用于类方法(通过 @classmethod 标识),而非普通的实例方法(带 self 参数的方法)。
- 实例方法需要先创建类的实例才能调用,而字段验证是在实例创建前对输入数据进行校验,因此 Pydantic 不允许将验证器定义为实例方法,否则会抛出这个用户错误。
类型嵌套
接口文档

请求参数

响应结果

接口文档

请求参数

{
"users": [
{
"name": "haha",
"age": 19,
"birth": "1995-01-10",
"friends": [],
"addr": {
"province": "广东",
"city": "深圳"
}
},
{
"name": "ren",
"age": 18,
"birth": "2001-01-11",
"friends": [],
"addr": {
"province": "北京",
"city": "朝阳"
}
}
]
}
响应结果

__EOF__
本文作者:持之以恒(韧)
关于博主:擅长性能、全链路、自动化、企业级自动化持续集成(DevTestOps)、测开等
面试必备:项目实战(性能、自动化)、简历笔试,https://www.cnblogs.com/uncleyong/p/15777706.html
测试提升:从测试小白到高级测试修炼之路,https://www.cnblogs.com/uncleyong/p/10530261.html
欢迎分享:如果您觉得文章对您有帮助,欢迎转载、分享,也可以点击文章右下角【推荐】一下!
关于博主:擅长性能、全链路、自动化、企业级自动化持续集成(DevTestOps)、测开等
面试必备:项目实战(性能、自动化)、简历笔试,https://www.cnblogs.com/uncleyong/p/15777706.html
测试提升:从测试小白到高级测试修炼之路,https://www.cnblogs.com/uncleyong/p/10530261.html
欢迎分享:如果您觉得文章对您有帮助,欢迎转载、分享,也可以点击文章右下角【推荐】一下!

浙公网安备 33010602011771号