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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM