FastAPI教程 額外的狀態(tài)碼

2021-11-08 09:44 更新

FastAPI 默認使用 JSONResponse 返回一個響應(yīng),將你的 路徑操作 中的返回內(nèi)容放到該 JSONResponse 中。

FastAPI 會自動使用默認的狀態(tài)碼或者使用你在 路徑操作 中設(shè)置的狀態(tài)碼。

額外的狀態(tài)碼

如果你想要返回主要狀態(tài)碼之外的狀態(tài)碼,你可以通過直接返回一個 Response 來實現(xiàn),比如 JSONResponse,然后直接設(shè)置額外的狀態(tài)碼。

例如,假設(shè)你想有一個 路徑操作 能夠更新條目,并且更新成功時返回 200 「成功」 的 HTTP 狀態(tài)碼。

但是你也希望它能夠接受新的條目。并且當這些條目不存在時,會自動創(chuàng)建并返回 201 「創(chuàng)建」的 HTTP 狀態(tài)碼。

要實現(xiàn)它,導(dǎo)入 JSONResponse,然后在其中直接返回你的內(nèi)容,并將 status_code 設(shè)置為為你要的值。

from typing import Optional

from fastapi import Body, FastAPI, status
from fastapi.responses import JSONResponse

app = FastAPI()

items = {"foo": {"name": "Fighters", "size": 6}, "bar": {"name": "Tenders", "size": 3}}


@app.put("/items/{item_id}")
async def upsert_item(
    item_id: str, name: Optional[str] = Body(None), size: Optional[int] = Body(None)
):
    if item_id in items:
        item = items[item_id]
        item["name"] = name
        item["size"] = size
        return item
    else:
        item = {"name": name, "size": size}
        items[item_id] = item
        return JSONResponse(status_code=status.HTTP_201_CREATED, content=item)

警告

當你直接返回一個像上面例子中的 Response 對象時,它會直接返回。

FastAPI 不會用模型等對該響應(yīng)進行序列化。

確保其中有你想要的數(shù)據(jù),且返回的值為合法的 JSON(如果你使用 JSONResponse 的話)。

技術(shù)細節(jié)

你也可以使用 from starlette.responses import JSONResponse?!?/p>

出于方便,F(xiàn)astAPI 為開發(fā)者提供同 starlette.responses 一樣的 fastapi.responses。但是大多數(shù)可用的響應(yīng)都是直接來自 Starlette。status 也是一樣。

OpenAPI 和 API 文檔

如果你直接返回額外的狀態(tài)碼和響應(yīng),它們不會包含在 OpenAPI 方案(API 文檔)中,因為 FastAPI 沒辦法預(yù)先知道你要返回什么。

但是你可以使用 額外的響應(yīng) 在代碼中記錄這些內(nèi)容。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號