請求體
FastAPI 使用請求體從客戶端(例如瀏覽器)向 API 發送數據。請求體是客戶端發送給 API 的數據。響應體是 API 發送給客戶端的數據。
使用 Pydantic 模型聲明請求體,能充分利用它的功能和優點
from fastapi import FastAPI
from pydantic import BaseModel # 導入BaseModel 用于數據模型定義class Item(BaseModel):# 把數據模型聲明為繼承BaseModel的類name: strdescription: str | None = Noneprice: floattax: float | None = Noneapp = FastAPI()@app.post("/items/")
async def create_item(item: Item):return item
FastAPI 支持同時聲明請求體、路徑參數和查詢參數。
查詢參數和字符串校驗
可以為查詢參數添加額外的約束條件
使用Query明確告訴 FastAPI 這是一個查詢參數,并且提供參數的額外配置和驗證規則
Query常用參數:
Query(default=None, # 默認值max_length=50, # 最大長度min_length=1, # 最小長度regex="^[a-zA-Z]+$", # 正則表達式驗證description="搜索關鍵詞", # 參數描述example="hello" # 示例值
)
from fastapi import FastAPI, Query # 導入Queryapp = FastAPI()@app.get("/items")
# 將 Query 用作查詢參數的默認值,并將它的 max_length 參數設置為 50
async def read_items(q : str | None = Query(default="hey", max_length=50, min_length=1, regex="^hey+")):results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}if q:results.update({"q": q})return results
多個查詢參數
當你使用 Query 顯式地定義查詢參數時,你還可以聲明它去接收一組值,或換句話來說,接收多個值。
from fastapi import FastAPI, Query # 導入Queryapp = FastAPI()@app.get("/items")
# 將 Query 用作查詢參數的默認值,并將它的 max_length 參數設置為 50
async def read_items(q : list[str] | None = Query(default=None)):query_items = {"q" : q}return query_items
訪問:http://localhost:8000/items?q=foo&q=bar
結果:
還可以定義默認的列表值
async def read_items(q : list[str] | None = Query(default=["1", "2"])):
還可以添加title、description添加參數的元數據
async def read_items(q : list[str] | None = Query(default=["1", "2"], title="q query", description="description of q")):
參數別名
假設你想要查詢參數為 item-query,但是 item-query 不是一個有效的 Python 變量名稱。這時你可以用 alias 參數聲明一個別名,該別名將用于在 URL 中查找查詢參數值
from fastapi import FastAPI, Query # 導入Queryapp = FastAPI()@app.get("/items")
# 將 Query 用作查詢參數的默認值,并將它的 max_length 參數設置為 50
async def read_items(q : str | None = Query(default=None, max_length=50, alias="item-query")):results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}if q:results.update({"q": q})return results
棄用參數
將參數 deprecated=True 傳入 Query,在文檔中會標記已棄用
async def read_items(q : str | None = Query(default=None, max_length=50, alias="item-query", deprecated=True)):
路徑參數和數值校驗
與使用 Query 為查詢參數聲明更多的校驗和元數據的方式相同,你也可以使用 Path 為路徑參數聲明相同類型的校驗和元數據
Annotated 是 Python 中用于添加元數據到類型注解的特殊類型。使用格式為Annotated[類型, 元數據1, 元數據2, …]
路徑參數使用Path聲明
from fastapi import FastAPI, Query , Path# 導入Path和Query類
from typing import Annotatedapp = FastAPI()@app.get("/items/{item_id}")
# 將 Query 用作查詢參數的默認值,并將它的 max_length 參數設置為 50
async def read_items(item_id: Annotated[int, Path(title="The ID of the item to get")],q: Annotated[str | None, Query(max_length=50)] = None):results = {"item_id": item_id}if q:results.update({"q": q})return results
在參數列表前加上*表示其后面的參數必須顯式指定
數值約束
可以對數值類型參數約束其范圍
- ge: 大于等于
- le: 小于等于
- gt: 大于
- lt: 小于
from fastapi import FastAPI, Pathapp = FastAPI()@app.get("/items/{item_id}")
async def read_items(*, item_id: int = Path(title="The ID of the item to get", ge=1), q: str
):results = {"item_id": item_id}if q:results.update({"q": q})return results