FastAPI 教程(五)

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

详细文档可以查看 https://pydantic-docs.helpmanual.io/usage/types/

你可能感兴趣的:(FastAPI 教程(五))