方向不对,努力白费,经验类测试技术才是职场重要保险! | (点击→)【提醒】AI赋能的前提是对常规测试技术非常的熟悉,联系作者vx了解

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)

 

接口文档

image

 

请求数据

image

 

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

image

 

控制台输出内容:

image

 

添加默认值

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)

  

访问接口文档

image

 接口文档

image

 

请求数据

image

 

响应结果

image

 

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

name没有默认值

class User(BaseModel):
    name: str
    age: int = 18
    birth: date | None = None
    friends: List[int] = []

 

接口文档

image

 

请求数据,不传name

image

 

响应报错

image

 

添加约束

数字约束

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不符合要求

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 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

  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

 

posted @ 2026-01-25 16:26  全栈测试笔记  阅读(0)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end