Saltar a contenido

Modelos de Parámetros de Cookie

AI coding agents

Use the official FastAPI skill for your installed version. Install it from your project directory:

uvx library-skills

See Develop with AI.

🌐 Traducción por IA y humanos

Esta traducción fue hecha por IA guiada por humanos. 🤝

Podría tener errores al interpretar el significado original, o sonar poco natural, etc. 🤖

Puedes mejorar esta traducción ayudándonos a guiar mejor al LLM de IA.

Versión en inglés

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

Esto te permitirá 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 compatible desde la versión 0.115.0 de FastAPI. 🤓

Consejo

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

Cookies con un Modelo de Pydantic

Declara los parámetros de cookie que necesites en un modelo de 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
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

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 el request y te entregará el modelo de Pydantic que definiste.

Revisa la Documentación

Puedes ver las cookies definidas en la UI de la 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 UI de la 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 UI de la documentación funciona con JavaScript, las cookies no serán enviadas y verás un mensaje de error como si no hubieras escrito ningún valor.

Prohíbe Cookies Extra

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

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

Puedes usar la configuración del modelo de Pydantic para forbid 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
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

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á un response 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á un response de error que le informa que la santa_tracker cookie no está permitida:

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

Combina Modelos de Parámetros

Puedes combinar múltiples modelos de parámetros de cookie con parámetros de cookie individuales y dependencias. Cada modelo se extrae y se valida de forma independiente, como se explica para los modelos de parámetros de query.

La configuración extra de cada modelo se aplica a todos los parámetros de cookie, incluidos los declarados en otros modelos o dependencias. Con extra="forbid", se rechaza cualquier cookie que no forme parte de ese modelo. Con extra="allow", esas cookies se incluyen como campos extra del modelo.

Declara un modelo de parámetros de cookie con | None y un valor por defecto de None para hacer que el grupo sea opcional.

from typing import Annotated

from fastapi import Cookie, FastAPI
from pydantic import BaseModel

app = FastAPI()


class Preferences(BaseModel):
    theme: str
    locale: str


@app.get("/items/")
async def read_items(preferences: Annotated[Preferences | None, Cookie()] = None):
    return preferences
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

from fastapi import Cookie, FastAPI
from pydantic import BaseModel

app = FastAPI()


class Preferences(BaseModel):
    theme: str
    locale: str


@app.get("/items/")
async def read_items(preferences: Preferences | None = Cookie(default=None)):
    return preferences

Si no se envía ni theme ni locale, preferences es None. Si se envía cualquiera de los dos, FastAPI valida el modelo y requiere ambos campos.

Se aplican las mismas reglas para los valores por defecto, los campos extra y OpenAPI que para los modelos opcionales de parámetros de query.

Resumen

Puedes usar modelos de Pydantic para declarar cookies en FastAPI. 😎