作者:麥克煎蛋 出處:https://www.cnblogs.com/mazhiyong/ 轉載請保留這段聲明,謝謝!
Request Body是從客戶端發送到API端的數據內容。
一、單個Request Body
通過以下幾個簡單環節我們就可以完成對Request Body的處理。
1、導入Pydantic BaseModel
from pydantic import BaseModel
2、創建數據模型
聲明需要的數據模型,並且繼承自BaseModel。
class Item(BaseModel): name: str description: str = None price: float tax: float = None
模型屬性均基於標准的Python類型。
注意,與請求參數類似,如果模型屬性有缺省值,那么就意味着它不是必須的,如果缺省值是None,則意味着是可選的;否則,它就是必須的。
3、參數聲明
我們用聲明路徑參數和請求參數同樣的方式來聲明Request Body參數。
@app.post("/items/") async def create_item(item: Item): return item
通過以上的幾個環節,FastAPI就實現了以下功能:
(1)、從Request中解析出Body內容,並且輸出格式為JSON。
(2)、如果需要,進行相應的數據類型轉換。
(3)、校驗數據,如果校驗失敗則返回詳細錯誤信息。
(4)、通過聲明的參數對象來接收最終數據內容。
4、使用數據模型
你可以直接訪問數據模型的所有屬性。
from fastapi import FastAPI from pydantic import BaseModel class Item(BaseModel): name: str description: str = None price: float tax: float = None app = FastAPI() @app.post("/items/") async def create_item(item: Item): item_dict = item.dict() if item.tax: price_with_tax = item.price + item.tax item_dict.update({"price_with_tax": price_with_tax}) return item_dict
實際運行示例如下:
5、同時使用Request Body參數、路徑參數、請求參數
你可以同時聲明Request Body參數、路徑參數、請求參數這幾種不同類型的參數。
FastAPI會自動識別不同類型的參數,並且賦予參數對象正確的數據內容。
from fastapi import FastAPI from pydantic import BaseModel class Item(BaseModel): name: str description: str = None price: float tax: float = None app = FastAPI() @app.put("/items/{item_id}") async def create_item(item_id: int, item: Item, q: str = None): result = {"item_id": item_id, **item.dict()} if q: result.update({"q": q}) return result
函數參數按照如下的順序進行識別匹配:
(1)、如果這個參數已經在路徑中被聲明過,那么它就是一個路徑參數。
(2)、如果這個參數的類型是單類型的(如str、float、int、bool等),那么它就是一個請求參數。
(3)、如果這個參數的類型是Pydantic數據模型,那么它就被認為是Request Body參數。