系列文章:
FastAPI 學習之路(一)fastapi--高性能web開發框架
與使用 Query、Path 和 Body 在路徑操作函數中聲明額外的校驗和元數據的方式相同,你可以使用 Pydantic 的 Field 在 Pydantic 模型內部聲明校驗和元數據。我們看一個簡單的例子。
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="這是描述", max_length=300 ) price: float = Field(..., gt=0, description="價格必須大於0") tax: Optional[float] = None @app.put("/items/{itemid}") async def update_items(itemid: int, item: Item = Body(..., embed=True)): results = {"itemid": itemid, "item": item} return results
這里還是舉的一個物品的價格,還打折的例子,我們對於描述和price用了Field,我們看下效果。我們用postman請求下。問可以看到item還是一個參數組
那么我們看下我們代碼中條件,假如,我們現在的價格小於0.
我們可以看到,接口正常給我們返回了不應該小於0。我們可以看下接口文檔
Field 的工作方式和 Query、Path 和 Body 相同,包括它們的參數等等也完全相同。
我們可以看下Field的源碼。它里面是FieldInfo類實例化,然后校驗。
FieldInfo其實是繼承了父類Representation,然后實現了對應的方法。
那么我們在來看下boby, Query、Path 方法,
body,是一個方法,他是params的Query方法,
我們在往下看,發下,params的body類。
而Body的父類就是FieldInfo。和我們上面的Field一樣,只不過Field是直接使用的FieldInfo,body只是上面兩層做 了簡單的封裝,其實都是FieldInfo。
我們看下query
然后看到這里可能就發現下面就是一個Query類,
它是集成了Param類,Param類才是集成了FieldInfo類。
我們看下path
它也是params里面的Path類,
然后Param繼承了FieldInfo方法。
其實他們的共同的父類就是Representation。
從上面的代碼一頓跳轉,我們就能看出來,他們最后的根都是Representation,只是上面的boby, Query、Path方法的父類都是直接或者間接的繼承FieldInfo,而Field就是FieldInfo的實例化,FieldInfo繼承了Representation,它們本質上就是Representation類的子類。所以他們幾個的使用方法,和使用參數沒有太大的區別。
請記住當你從 fastapi 導入 Query、Path 等對象時,他們實際上是返回特殊類的函數。
你可以在 Field、Query、Body 中聲明額外的信息。這些信息將包含在生成的 JSON Schema 中。
文章首發在公眾號,歡迎關注。