FastAPI學習-6.POST請求 JSON 格式 body
阿新 • • 發佈:2022-03-03
前言
post請求接收json格式請求body
建立資料模型
從 pydantic 中匯入 BaseModel, 將你的資料模型宣告為繼承自 BaseModel 的類。
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
和宣告查詢引數時一樣,當一個模型屬性具有預設值時,它不是必需的。否則它是一個必需屬性。將預設值設為 None 可使其成為可選屬性。
例如,上面的模型聲明瞭一個這樣的 JSON「object」(或 Python dict):
{
"name": "Foo",
"description": "An optional description",
"price": 45.2,
"tax": 3.5
}
由於 description 和 tax 是可選的(它們的預設值為 None),下面的 JSON「object」也將是有效的:
{
"name": "Foo",
"price": 45.2
}
完整的post請求程式碼
from typing import Optional from fastapi import FastAPI from pydantic import BaseModel import uvicorn class Item(BaseModel): name: str description: Optional[str] = None price: float tax: Optional[float] = None app = FastAPI() @app.post("/items/") async def create_item(item: Item): return item if __name__ == '__main__': uvicorn.run(app)
使用了 Python 型別宣告,FastAPI 將會:
- 將請求體作為 JSON 讀取。
- 轉換為相應的型別(在需要時)。
- 校驗資料。 如果資料無效,將返回一條清晰易讀的錯誤資訊,指出不正確資料的確切位置和內容。
- 將接收的資料賦值到引數 item 中。由於你已經在函式中將它宣告為 Item 型別,你還將獲得對於所有屬性及其型別的一切編輯器支援(程式碼補全等)。
- 為你的模型生成 JSON 模式 定義,你還可以在其他任何對你的專案有意義的地方使用它們。
- 這些模式將成為生成的 OpenAPI 模式的一部分,並且被自動化文件 UI 所使用。
啟動服務後,使用 postman 測試介面
docs 文件
你所定義模型的 JSON 模式將成為生成的 OpenAPI 模式的一部分,並且在互動式 API 文件中展示:
body + path路徑引數
你可以同時宣告路徑引數和請求體。
FastAPI 將識別出與路徑引數匹配的函式引數應從路徑中獲取,而宣告為 Pydantic 模型的函式引數應從請求體中獲取。
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
app = FastAPI()
@app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item):
return {"item_id": item_id, **item.dict()}
body + path路徑引數 + query查詢引數
你還可以同時宣告請求體、路徑引數和查詢引數。
FastAPI 會識別它們中的每一個,並從正確的位置獲取資料。
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
app = FastAPI()
@app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item, q: Optional[str] = None):
result = {"item_id": item_id, **item.dict()}
if q:
result.update({"q": q})
return result
函式引數將依次按如下規則進行識別:
- 如果在路徑中也聲明瞭該引數,它將被用作路徑引數。
- 如果引數屬於單一型別(比如 int、float、str、bool 等)它將被解釋為查詢引數。
- 如果引數的型別被宣告為一個 Pydantic 模型,它將被解釋為請求體。