Saltar al contenido

Modelos de Parámetros Cookie

Si tienes un grupo de cookies relacionadas, puedes crear un modelo Pydantic para declararlas. 🍪

Esto te permitiría reutilizar el modelo en múltiples lugares y también declarar validaciones y metadatos para todos los parámetros a la vez. 😎

Nota

Esto es soportado desde la versión 0.115.0 de FastAPI. 🤓

Consejo

Esta misma técnica aplica a Query, Cookie y Header. 😎

Cookies con un Modelo Pydantic

Declara los parámetros de cookie que necesitas en un modelo Pydantic, y luego declara el parámetro como Cookie:

from typing import Annotated

from fastapi import Cookie, FastAPI
from pydantic import BaseModel

app = FastAPI()


class Cookies(BaseModel):
    session_id: str
    fatebook_tracker: str | None = None
    googall_tracker: str | None = None


@app.get("/items/")
async def read_items(cookies: Annotated[Cookies, Cookie()]):
    return cookies
🤓 Otras versiones y variantes

Consejo

Preferible usar la versión con Annotated si es posible.

from fastapi import Cookie, FastAPI
from pydantic import BaseModel

app = FastAPI()


class Cookies(BaseModel):
    session_id: str
    fatebook_tracker: str | None = None
    googall_tracker: str | None = None


@app.get("/items/")
async def read_items(cookies: Cookies = Cookie()):
    return cookies

FastAPI extraerá los datos para cada campo de las cookies recibidas en la petición y te dará el modelo Pydantic que definiste.

Revisar la Documentación

Puedes ver las cookies definidas en la interfaz de documentación en /docs:

Nota

Ten en cuenta que, como los navegadores manejan las cookies de maneras especiales y detrás de escenas, no permiten fácilmente que JavaScript las toque.

Si vas a la interfaz de documentación de la API en /docs podrás ver la documentación de las cookies para tus path operations.

Pero incluso si rellenas los datos y haces clic en "Execute", como la interfaz de documentación funciona con JavaScript, las cookies no se enviarán, y verás un mensaje de error como si no hubieras escrito ningún valor.

Prohibir Cookies Extra

En algunos casos de uso especiales (probablemente no muy comunes), podrías querer restringir las cookies que quieres recibir.

Tu API ahora tiene el poder de controlar su propio consentimiento de cookies. 🤪🍪

Puedes usar la configuración del modelo de Pydantic para prohibir cualquier campo extra:

from typing import Annotated

from fastapi import Cookie, FastAPI
from pydantic import BaseModel

app = FastAPI()


class Cookies(BaseModel):
    model_config = {"extra": "forbid"}

    session_id: str
    fatebook_tracker: str | None = None
    googall_tracker: str | None = None


@app.get("/items/")
async def read_items(cookies: Annotated[Cookies, Cookie()]):
    return cookies
🤓 Otras versiones y variantes

Consejo

Preferible usar la versión con Annotated si es posible.

from fastapi import Cookie, FastAPI
from pydantic import BaseModel

app = FastAPI()


class Cookies(BaseModel):
    model_config = {"extra": "forbid"}

    session_id: str
    fatebook_tracker: str | None = None
    googall_tracker: str | None = None


@app.get("/items/")
async def read_items(cookies: Cookies = Cookie()):
    return cookies

Si un cliente intenta enviar algunas cookies extra, recibirá una respuesta de error.

Pobres banners de cookies con todo su esfuerzo para obtener tu consentimiento para que la API lo rechace. 🍪

Por ejemplo, si el cliente intenta enviar una cookie santa_tracker con un valor de good-list-please, el cliente recibirá una respuesta de error diciéndole que la cookie santa_tracker no está permitida:

{
    "detail": [
        {
            "type": "extra_forbidden",
            "loc": ["cookie", "santa_tracker"],
            "msg": "Extra inputs are not permitted",
            "input": "good-list-please",
        }
    ]
}

Resumen

Puedes usar modelos Pydantic para declarar cookies en FastAPI. 😎