Body Field 校验
检验可以写在路由方法中,用 Query、Body、Path 等方法来写入校验条件,也可以使用 Pydantic 中的 Field 类来实现,Field 的用法与前面讲到的 Query、Body 等类似,例如:
from typing import Optional
from fastapi import Body, FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = Field(
None, title="The description of the item", max_length=300
)
price: float = Field(..., gt=0, description="The price must be greater than zero")
tax: Optional[float] = None
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item = Body(..., embed=True)):
results = {"item_id": item_id, "item": item}
return results
在使用的时候,还可以加入一些额外的信息,都会生成在最终的 JSON Schema 中。
使用 typing 中的 List 和 Set 类型
我们可以使用 typing 中 List 和 Set 类型来指定 Model 中的数据类型,例如:
from typing import Optional, List, Set
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
tags: List[str] = []
categories: Set[str] = set()
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):
results = {"item_id": item_id, "item": item}
return results
我们在测试的时候就可以输入类似这样的数据:
image.png
嵌套 Model
我们定义的 Model 中可以包含其他 Model 类型的数据,例如:
from typing import Optional, Set
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Image(BaseModel):
url: str
name: str
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
tags: Set[str] = []
# 下面是 image 类型的数据
image: Optional[Image] = None
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):
results = {"item_id": item_id, "item": item}
return results
这样我i们的请求体的数据就是类似下面的形式:
{
"name": "Foo",
"description": "The pretender",
"price": 42.0,
"tax": 3.2,
"tags": ["rock", "metal", "bar"],
"image": {
"url": "http://example.com/baz.jpg",
"name": "The Foo live"
}
}
在请求体中接收Model的列表
我们在请求体中可以输入多个 Model 组成的列表,例如:
from typing import List
from fastapi import FastAPI
from pydantic import BaseModel, HttpUrl
app = FastAPI()
class Image(BaseModel):
url: HttpUrl
name: str
@app.post("/images/multiple/")
async def create_multiple_images(images: List[Image]): # 接收一个 image 类型的列表
return images
在请求体中接收 dict 类型
我们可以先引入 typing 中的 Dict ,然后作为路由方法的参数,例如:
from typing import Dict
from fastapi import FastAPI
app = FastAPI()
@app.post("/index-weights/")
async def create_index_weights(weights: Dict[int, float]):
return weights
那么我们就可以传入类似这样的数据:
{
"1": 2.2,
"2": 3.3,
"3": 5.5
}
这里1,2,3之所以要加引号,是因为 JSON 格式对 key 的要求,不能直接用数字。
其他数据类型
Pydantic 模型支持很丰富的数据类型,除了常用的 str、int、float外还有:
- UUID: 需要先 from uuid import UUID
- datetime.date: 日期
- datetime.time: 时间
- FilePath: pydantic 自带的类型,文件必须存在
- EmailStr: 需要安装 email_validator
- AnyUrl、AnyHttpUrl、HttpUrl: url类型
网友评论