预设值

如果你有一个接收路径参数的路径操作,但你希望预先设定可能的有效参数值,则可以使用标准的 Python Enum 类型。

就类似于choise枚举,举个栗子,你现在可能要接收一个性别

from enum import Enum

class ModelName(str, Enum):
    nan = "男"
    nv = "女"
    lenet = "未知"

@app.post("/Yawp/")
async def transfer(model_name: ModelName):

    return {'msg':model_name}

这样,我们需要传的model_name,只剩下这三个选项

同时,他也可以声明路径参数

补充关于参数的一点,如果你想要让这个参数是一个必填的参数,只需要将其不设置默认值即可,例如:

async def read_user_item(item_id: str, needy: str=None):

像这种情况,item_id,就是必须填进的一个参数了,而needy有默认值,None,所以,他并不是一个必填的参数

另外一个小技巧,在fastapi交互式文档上操作,可以最大限度的避免一些基础错误,所以,要养成使用交互式文档的习惯哦

请求体

请求体就不用过多介绍了,这是基础中的基础了,如果不懂请自行百度
我们需要先导入BaseModel,来创建数据模型

from pydantic import BaseModel
class Item(BaseModel):
    name:str
    description: Optional[str] = None
    price:float
    tax:Optional[float] = None
async def main(item:Item):
    print(item.dict())
    print(item.name)
    return 

和声明查询参数时一样,当一个模型属性具有默认值时,它不是必需的。否则它是一个必需属性。将默认值设为 None 可使其成为可选属性。

我们可以在函数内通过某个字段来进行查看,或者直接dict,获取所有数据

值得说的一点是,请求体传值并不影响url传参,也就是说,我们依旧可以使用路径参数

函数参数将依次按如下规则进行识别:

如果在路径中也声明了该参数,它将被用作路径参数。
如果参数属于单一类型(比如 int、float、str、bool 等)它将被解释为查询参数。
如果参数的类型被声明为一个 Pydantic 模型,它将被解释为请求体。
如果你不想使用 Pydantic 模型,你还可以使用 Body 参数。稍后介绍

约束校验

Query(查询参数)
Query第一个参数用来定义默认值

可用于限制长度或者正则表达式

#q参数必须为字符串,默认值为None,如果为…,则这个参数必须给值,最小长度3,最大长度50
async def reds(q:str = Query(None,min_length=3,max_length=50)

async def read_items(q: Optional[List[str]] = Query(None)):这种情况,是可以接收多个q参数的,?q=foo&q=bar

声明必须参数

之前说过,我们声明必须传的参数,只需要将其不设默认即可,现在可以有第二种方法,就是…,

将其默认值设置为…时,他就是一个必须传入的参数了

请求体字段验证

与使用 QueryPathBody 在路径操作函数中声明额外的校验和元数据的方式相同,你可以使用 Pydantic 的 Field 在 Pydantic 模型内部声明校验和元数据。像这样

class Item(BaseModel):
    name:str
    description: Optional[str] = Field(None, title="The description of the item", max_length=300)
    price:float
    tax:Optional[float] = None

模型嵌套

在我们声明模型的时候,他的值不只是单一的字符串,数字等, 像一些列表,集合也同样可以定义,像这样

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None
    tags: list = []

这将使 tags 成为一个由元素组成的列表。不过它没有声明每个元素的类型。

但是 Python 有一种特定的方法来声明具有子类型的列表。

我们需要从typing导入List,将模型内部改为tags: List[str] = []

Pydantic 模型的每个属性都具有类型。

但是这个类型本身可以是另一个 Pydantic 模型。

因此,你可以声明拥有特定属性名称、类型和校验的深度嵌套的 JSON 对象。

上述这些都可以任意的嵌套。

最后,有一点很重要,我们如果希望传一种像这样的数据:[{a:1},{a:2}],则可以在路径操作函数的参数中声明此类型,就像声明 Pydantic 模型一样:images: List[Image]

from pydantic import BaseModel,Field,HttpUrl
class img(BaseModel):
    url:HttpUrl
    name:str


@app.post("/Yawp/")
async def transfer(*,a:List[img]):
    for i in a:
        print(i.name)
        print(i.url)
    # for i in a:
    #     print(i)
    return {'msg':a}