附加状态码¶
默认情况下,FastAPI 将使用 JSONResponse
返回响应,并将您从路径操作中返回的内容放在该 JSONResponse
中。
它将使用默认状态码或您在路径操作中设置的状态码。
附加状态码¶
如果您想除了主要状态码之外返回其他状态码,您可以通过直接返回 Response
(例如 JSONResponse
)并直接设置其他状态码来实现。
例如,假设您想要一个允许更新项目的路径操作,并在成功时返回 HTTP 状态码 200 "OK"。
但您也希望它接受新项目。当项目之前不存在时,它会创建项目,并返回 HTTP 状态码 201 "Created"。
要实现这一点,请导入 JSONResponse
,并将您的内容直接返回到那里,设置您想要的 status_code
from typing import Annotated
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: Annotated[str | None, Body()] = None,
size: Annotated[int | None, 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)
from typing import Annotated, 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: Annotated[Union[str, None], Body()] = None,
size: Annotated[Union[int, None], 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)
from typing import Union
from fastapi import Body, FastAPI, status
from fastapi.responses import JSONResponse
from typing_extensions import Annotated
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: Annotated[Union[str, None], Body()] = None,
size: Annotated[Union[int, None], 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)
提示
如果可能,请优先使用 Annotated
版本。
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: str | None = Body(default=None),
size: 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)
提示
如果可能,请优先使用 Annotated
版本。
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
时,就像上面的例子一样,它将被直接返回。
它不会与模型一起序列化,等等。
确保它包含您想要的数据,并且值是有效的 JSON(如果您使用的是 JSONResponse
)。
"技术细节"
您也可以使用 from starlette.responses import JSONResponse
。
FastAPI 提供与 fastapi.responses
相同的 starlette.responses
,只是为了方便您(开发人员)。但大多数可用的响应直接来自 Starlette。status
也是如此。
OpenAPI 和 API 文档¶
如果您直接返回其他状态码和响应,它们将不会包含在 OpenAPI 架构(API 文档)中,因为 FastAPI 没有办法提前知道您将返回什么。
但是您可以在代码中使用以下方法进行文档记录:附加响应。