Saltar a contenido

Response - Cambiar el Status Code

Probablemente ya has leído con anterioridad que puedes establecer un Response Status Code por defecto.

Pero en algunos casos necesitas retornar un status code diferente al predeterminado.

Casos de uso

Por ejemplo, imagina que quieres retornar un HTTP status code de "OK" 200 por defecto.

Pero si los datos no existen, quieres crearlos y retornar un HTTP status code de "CREATED" 201.

Pero aún quieres poder filtrar y convertir los datos que retornas 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 la operación de path (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 retornar cualquier objeto que necesites, como normalmente lo harías (un dict, un modelo de base de datos, etc).

Y si declaraste un response_model, aún se usará para filtrar y convertir el objeto que retornaste.

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 retornaste, filtrado por cualquier response_model.

También puedes declarar la dependencia del parámetro Response, y establecer el código de estado en ellos. Pero ten en cuenta que el último en establecerse será el que gane.