1. 程式人生 > 其它 >FastAPI(9)- 多個 Request Body

FastAPI(9)- 多個 Request Body

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"
    }
}

正確傳參的請求結果

檢視 Swagger API 文件