1. 程式人生 > 其它 >FastAPI學習-6.POST請求 JSON 格式 body

FastAPI學習-6.POST請求 JSON 格式 body

前言

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