FastAPI(9)- 多個 Request Body
阿新 • • 發佈:2022-01-05
FastAPI(9)- 多個 Request Body
Path、Query、Request Body 混合使用
from fastapi import FastAPI, Path, Query
from typing import Optional
from pydantic import BaseModel
import uvicorn
app = FastAPI()
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
@app.put("/items/{item_id}" )
async def update_item(
*,
item_id: int = Path(default=..., description="item_id", gt=1, lt=20, example=2),
name: Optional[str] = Query(default=None, description="查詢引數", min_length=0, max_length=20, example="示例值"),
item: Optional[Item] = None
):
results = {"item_id" : item_id}
if name:
results.update({"name": name})
if item:
results.update({"item": item})
return results
if __name__ == "__main__":
uvicorn.run(app="7_multiple_parameters:app", host="127.0.0.1", port=8080, reload=True, debug=True)
除了路徑引數 item_id 是必傳的,查詢引數 name 和請求體 item 都是可選非必傳
只傳路徑引數的請求結果
路徑引數、查詢引數、請求體均傳遞的請求結果
檢視 Swagger API 文件
多個 Request Body
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
# 自定義模型類 1
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
# 自定義模型類 2
class User(BaseModel):
username: str
full_name: Optional[str] = None
@app.put("/items/{item_id}")
async def update_item(item_id: int,
item: Item, # 指定第一個 Model 型別
user: User): # 指定第二個 Model 型別
results = {
"item_id": item_id,
"item": item,
"user": user
}
return results
- 這種情況下,FastAPI 會注意到函式中有兩個 Request Body,因為這 item、user 兩個引數都指定了 Pydantic 模型
- FastAPi 將使用引數名作為 Request Body 中的鍵(欄位名稱)
期望得到的 Request Body
{
"item": {
"name": "Foo",
"description": "The pretender",
"price": 42.0,
"tax": 3.2
},
"user": {
"username": "dave",
"full_name": "Dave Grohl"
}
}