美文网首页
FastAPI 教程(五)

FastAPI 教程(五)

作者: Frederich | 来源:发表于2020-07-09 10:15 被阅读0次

    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 教程(五)

          本文链接:https://www.haomeiwen.com/subject/isaccktx.html