前言
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 模型,它將被解釋為請求體。
