预设值
如果你有一个接收路径参数的路径操作,但你希望预先设定可能的有效参数值,则可以使用标准的 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
声明必须参数
之前说过,我们声明必须传的参数,只需要将其不设默认即可,现在可以有第二种方法,就是…,
将其默认值设置为…时,他就是一个必须传入的参数了
请求体字段验证
与使用 Query
、Path
和 Body
在路径操作函数中声明额外的校验和元数据的方式相同,你可以使用 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}
- Post link: https://www.godhearing.cn/fastapi-xue-xi-zhi-lu-3-mo-xing-yu-xiao-yan/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.