FastAPI 學習之路(十)請求體的字段


系列文章:

  FastAPI 學習之路(一)fastapi--高性能web開發框架

  FastAPI 學習之路(二)

  FastAPI 學習之路(三)

  FastAPI 學習之路(四)

  FastAPI 學習之路(五)

      FastAPI 學習之路(六)查詢參數,字符串的校驗

  FastAPI 學習之路(七)字符串的校驗

    FastAPI 學習之路(八)路徑參數和數值的校驗

  FastAPI 學習之路(九)請求體有多個參數如何處理?

與使用 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 中。

文章首發在公眾號,歡迎關注。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM