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

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 dateapp = FastAPI()class User(BaseModel):name: strage: intbirth: datefriends: List[int]@app.post("/user")
def create_user(user:User):  # 形参名可以随意,但是类型必须是Userprint(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)

 

接口文档

image

 

请求数据

image

 

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

image

 

控制台输出内容:

image

 

添加默认值

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

  

访问接口文档

image

 接口文档

image

 

请求数据

image

 

响应结果

image

 

属性没有给默认值的是必填

name没有默认值

class User(BaseModel):name: strage: int = 18birth: date | None = Nonefriends: List[int] = []

 

接口文档

image

 

请求数据,不传name

image

 

响应报错

image

 

添加约束

数字约束

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

 

请求数据,age不符合要求

image

 

响应报错

image

 

 字符串约束

name: str = Field(pattern="^a")  # name必须a开头

  

接口文档,以及默认填入了a

image

 

请求参数

image

 

错误响应

image

 

name: str = Field(pattern="^[A-Z][A-Za-z0-9]{4,6}$",title="用户名",description="大写字母开头,用户名4-6位")

  

接口文档,name自动生成符合规则的

image

 

定义方法校验

类中也可以写一个方法来对某个属性做校验,这样很灵活
from fastapi import FastAPI
import uvicorn
from typing import List
from pydantic import BaseModel, Field, field_validator
from datetime import dateapp = 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 : strage: int = Field(default=18,gt=0,lt=120,title="年龄",description="年龄0-120")birth: date | None = Nonefriends: List[int] = []@field_validator('name')@classmethoddef name_must_alpha(cls, v):assert v.isalpha(), 'name must be alpha'  # 如果未false,会抛出后面的错误信息name must be alphaif len(v) < 3 or len(v) > 5:raise ValueError('用户名长度不能小于3大于5')return v@app.post("/user")
def create_user(user:User):  # 形参名可以随意,但是类型必须是Userreturn 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

  1. @field_validator 是 Pydantic(主要是 v2 版本)中用于验证模型字段的装饰器,它的设计初衷是作用于类方法(通过 @classmethod 标识),而非普通的实例方法(带 self 参数的方法)。
  2. 实例方法需要先创建类的实例才能调用,而字段验证是在实例创建前对输入数据进行校验,因此 Pydantic 不允许将验证器定义为实例方法,否则会抛出这个用户错误。
 

类型嵌套

接口文档

image

 

请求参数

image

 

响应结果

image

 

接口文档

image

 

请求参数

image

 

{"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": "朝阳"}}]
}

  

响应结果

image

 

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

相关文章:

  • 别只盯着那只“鹦鹉”了!Claude3.7与Sora2才是真正的生产力怪兽
  • 2026链条直销厂家榜:获取优质厂家联系方式,链条/非标链条/不锈钢链条/工业链条,链条源头厂家推荐排行
  • Agent Skill:新一代 AI 设计模式的原理、实践与 MCP 协同应用解析
  • Git行尾符战争:如何彻底解决CRLF与LF的跨平台噩梦
  • hot100 230.二叉搜索树中第K小的元素
  • hot100 199.二叉树的右视图
  • hot100 108.将有序数组转换为二叉搜索树
  • hot100 98.验证二叉搜索树
  • 做久坐提醒+拉伸指导工具,设定工作时长,久坐超一小时自动提醒,推送三分钟简易拉伸动作(图文步骤),记录每日拉伸次数。
  • Java毕设项目:基于springboot的社区健康管理系统(源码+文档,讲解、调试运行,定制等)
  • Java计算机毕设之基于springboot的社区健康管理系统基于SpringBoot的社区医疗健康管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • markdown博客发布多平台实战指南
  • 2025精选浙江干式打磨台靠谱厂家推荐,水帘除尘器/湿式打磨台/喷淋塔除尘器/活性炭吸附干式打磨台制造厂家怎么选择
  • 抖音直播卖货起号-汽水账号自然流提高了
  • 【毕业设计】基于springboot的社区健康管理系统(源码+文档+远程调试,全bao定制等)
  • 【课程设计/毕业设计】基于springboot的社区康养管理系统基于springboot的社区健康管理系统【附源码、数据库、万字文档】
  • SpringBoot快速上手,一周速通!
  • 从代码案例出发,从0到1详解Spring Boot!
  • 真正的高手,都是贝叶斯主义者
  • 中国软件最大的短板,就藏在那个最窝囊的部门
  • 实用指南:ICT运维面试问那些问题
  • 实用指南:战略合作 | 深信科创携手北极雄芯、灵猴机器人共推国产智能机器人规模化落地
  • windows系统如何查看端口被占用、杀进程
  • 【简单小项目】从零用C语言实现贪吃蛇
  • Java反序列化CommonsCollections篇CC1
  • 详细介绍:用 Flink CDC 将 MySQL 实时同步到 StarRocks
  • 基数估计的黑魔法:HyperLogLog 原理与实现
  • IO模型有哪几种
  • 01-移植NXP官方的U-Boot
  • 让opencode+GLM-4.7+SKILL一起服务