跳转至

附加状态码

FastAPI 默认使用 JSONResponse 返回响应,路径操作返回的内容会放在 JSONResponse 里。

并使用默认状态码或在路径操作中设置的状态码。

附加状态码

返回主状态码之外的附加状态码时,要直接返回 JSONResponseResponse,并直接设置状态码。

例如,有一个更新商品(item)的路径操作,更新成功时要返回 HTTP 状态码 - 200 OK

但该路径操作要能接受新的商品。商品不存在时,还要能自动创建新商品并返回 HTTP 状态码 - 201 Created

为此,要导入 JSONResponse,然后直接返回 content,并设置 status_code

from typing import Union

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: Union[str, None] = Body(default=None),
    size: Union[int, None] = Body(default=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 不使用模型序列化该响应。

此时,要确保数据完整,如果使用的是 JSONResponse,还要确保返回值是有效的 JSON 数据。

技术细节

您还可以使用 from starlette.responses import JSONResponse。 

FastAPIfastapi.responsesstarlette.responses 一样,但绝大多数可用的响应都直接继承自 Starlette。status 也一样。

OpenAPI 和 API 文档

OpenAPI 概图(API 文档)不包含直接返回的状态码和响应,因为 FastAPI 无法预判返回的内容。

附加响应 可在代码中实现存档操作。