C贸digos de Estado Adicionales¶
Por defecto, FastAPI devolver谩 los responses usando un JSONResponse, colocando el contenido que devuelves desde tu path operation dentro de ese JSONResponse.
Usar谩 el c贸digo de estado por defecto o el que configures en tu path operation.
C贸digos de estado adicionales¶
Si quieres devolver c贸digos de estado adicionales aparte del principal, puedes hacerlo devolviendo un Response directamente, como un JSONResponse, y configurando el c贸digo de estado adicional directamente.
Por ejemplo, supongamos que quieres tener una path operation que permita actualizar elementos, y devuelva c贸digos de estado HTTP de 200 "OK" cuando sea exitoso.
Pero tambi茅n quieres que acepte nuevos elementos. Y cuando los elementos no exist铆an antes, los crea y devuelve un c贸digo de estado HTTP de 201 "Created".
Para lograr eso, importa JSONResponse, y devuelve tu contenido all铆 directamente, configurando el status_code que deseas:
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)
馃 Other versions and variants
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)
Tip
Prefer to use the Annotated version if possible.
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)
Tip
Prefer to use the Annotated version if possible.
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)
Advertencia
Cuando devuelves un Response directamente, como en el ejemplo anterior, se devuelve directamente.
No se serializar谩 con un modelo, etc.
Aseg煤rate de que tenga los datos que deseas que tenga y que los valores sean JSON v谩lidos (si est谩s usando JSONResponse).
Detalles T茅cnicos
Tambi茅n podr铆as usar from starlette.responses import JSONResponse.
FastAPI proporciona los mismos starlette.responses que fastapi.responses solo como una conveniencia para ti, el desarrollador. Pero la mayor铆a de los responses disponibles provienen directamente de Starlette. Lo mismo con status.
OpenAPI y documentaci贸n de API¶
Si devuelves c贸digos de estado adicionales y responses directamente, no se incluir谩n en el esquema de OpenAPI (la documentaci贸n de la API), porque FastAPI no tiene una forma de saber de antemano qu茅 vas a devolver.
Pero puedes documentarlo en tu c贸digo, usando: Responses Adicionales.