Saltar al contenido

Response - Cambiar Código de Estado

Probablemente ya leíste antes que puedes establecer un Código de Estado de Respuesta por defecto.

Pero en algunos casos necesitas devolver un código de estado diferente al por defecto.

Caso de uso

Por ejemplo, imagina que quieres devolver un código de estado HTTP de "OK" 200 por defecto.

Pero si los datos no existían, quieres crearlos, y devolver un código de estado HTTP de "CREATED" 201.

Pero aún quieres poder filtrar y convertir los datos que devuelves con un response_model.

Para esos casos, puedes usar un parámetro Response.

Usar un parámetro Response

Puedes declarar un parámetro de tipo Response en tu función de operación de ruta (como puedes hacer para cookies y headers).

Y luego puedes establecer el status_code en ese objeto de respuesta temporal.

from fastapi import FastAPI, Response, status

app = FastAPI()

tasks = {"foo": "Listen to the Bar Fighters"}


@app.put("/get-or-create-task/{task_id}", status_code=200)
def get_or_create_task(task_id: str, response: Response):
    if task_id not in tasks:
        tasks[task_id] = "This didn't exist before"
        response.status_code = status.HTTP_201_CREATED
    return tasks[task_id]

Y luego puedes devolver cualquier objeto que necesites, como lo harías normalmente (un dict, un modelo de base de datos, etc).

Y si declaraste un response_model, este se seguirá usando para filtrar y convertir el objeto que devolviste.

FastAPI usará esa respuesta temporal para extraer el código de estado (también cookies y headers), y los pondrá en la respuesta final que contiene el valor que devolviste, filtrado por cualquier response_model.

También puedes declarar el parámetro Response en dependencias, y establecer el código de estado en ellas. Pero ten en cuenta que el último en establecerse será el que prevalezca.