FastAPI基础-请求体验证(二)

2023-05-07 20:58:10 浏览数 (3)

使用请求体模型的可选字段

有时候我们希望某些字段是可选的,即在请求体中可以缺失。在Pydantic中,我们可以使用typing.Optional来定义可选字段。下面是一个示例:

代码语言:javascript复制
from typing import Optional

class User(BaseModel):
    name: str
    email: str
    age: Optional[int] = None

在上面的示例中,我们将age字段定义为可选字段,并设置默认值为None。这意味着客户端可以发送一个不包含age字段的请求体,而FastAPI会将其转换为一个age值为None的User对象。

使用请求体模型的嵌套字段

有时候我们需要验证请求体中的嵌套字段,即请求体中的某个字段又包含了一个对象。在Pydantic中,我们可以使用嵌套模型来处理这种情况。下面是一个示例:

代码语言:javascript复制
from typing import List

class Item(BaseModel):
    name: str
    price: float

class User(BaseModel):
    name: str
    email: str
    age: Optional[int] = None
    items: List[Item] = []

在上面的示例中,我们定义了一个名为Item的嵌套模型,用于验证请求体中的items字段。然后我们将items字段定义为一个列表类型,其元素类型为Item。这样,当客户端向服务器发送一个包含items字段的请求体时,FastAPI会自动使用Item模型来验证items字段中的每个元素。

使用请求体模型的校验器

在Pydantic中,我们还可以使用校验器(validator)来进一步验证请求体数据。校验器是一种可调用对象,用于对请求体数据进行额外的验证。下面是一个示例:

代码语言:javascript复制
from pydantic import validator

class User(BaseModel):
    name: str
    email: str
    age: Optional[int] = None

    @validator("name")
    def name_must_contain_space(cls, v):
        if " " not in v:
            raise ValueError("must contain space")
        return v

    @validator("age", pre=True)
    def age_must_be_positive(cls, v):
        if v is not None and v < 0:
            raise ValueError("must be positive")
        return v

在上面的示例中,我们定义了两个校验器。第一个校验器用于验证name字段中是否包含空格。如果name字段中不包含空格,则校验器会抛出一个ValueError异常,表示请求体数据无效。第二个校验器用于验证age字段中的值是否为正数。由于age字段是可选的,因此我们需要在校验器中使用pre=True参数来确保该校验器在默认值验证之前执行。

0 人点赞