Перейти до змісту

Моделі для Cookie-параметрів

Якщо у Вас є група cookies параметрів, які пов'язані між собою, Ви можете створити Pydantic-модель, щоб оголосити їх. 🍪

Це дозволить Вам повторно використовувати модель у різних місцях, а також оголосити валідацію та метадані для всіх параметрів одночасно. 😎

Нотатки

Це підтримується з версії FastAPI 0.115.0. 🤓

Порада

Ця ж техніка застосовується до Query, Cookie, та Header. 😎

Оголосіть cookie-параметри, які Вам потрібні, у Pydantic-моделі, а потім оголосіть параметр як 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
from typing import Annotated, Union

from fastapi import Cookie, FastAPI
from pydantic import BaseModel

app = FastAPI()


class Cookies(BaseModel):
    session_id: str
    fatebook_tracker: Union[str, None] = None
    googall_tracker: Union[str, None] = None


@app.get("/items/")
async def read_items(cookies: Annotated[Cookies, Cookie()]):
    return cookies
from typing import Union

from fastapi import Cookie, FastAPI
from pydantic import BaseModel
from typing_extensions import Annotated

app = FastAPI()


class Cookies(BaseModel):
    session_id: str
    fatebook_tracker: Union[str, None] = None
    googall_tracker: Union[str, None] = None


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

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

Tip

Prefer to use the Annotated version if possible.

from typing import Union

from fastapi import Cookie, FastAPI
from pydantic import BaseModel

app = FastAPI()


class Cookies(BaseModel):
    session_id: str
    fatebook_tracker: Union[str, None] = None
    googall_tracker: Union[str, None] = None


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

FastAPI буде витягувати дані для кожного поля з cookie параметрів, отриманих у запиті, і передавати Вам Pydantic-модель, яку Ви визначили.

Перевірка у документації

Ви можете побачити визначені cookie в інтерфейсі документації за адресою /docs:

Інформація

Майте на увазі, що оскільки браузери обробляють cookie особливим чином і "за лаштунками", вони не дозволяють JavaScript легко з ними працювати.

Якщо Ви зайдете до інтерфейсу документації API за адресою /docs, Ви зможете побачити документацію для cookie у Ваших операціях шляху.

Але навіть якщо Ви заповните дані й натиснете "Execute", оскільки інтерфейс документації працює з JavaScript, cookie не будуть відправлені, і Ви побачите помилку, ніби Ви не ввели жодних значень.

У деяких спеціальних випадках (ймовірно, не дуже поширених) Ви можете захотіти обмежити список cookie, які хочете отримувати.

Ваша API тепер має можливість контролювати власну згоду на cookie. 🤪🍪

Ви можете використовувати налаштування моделі Pydantic, щоб заборонити будь-які додаткові поля:

from typing import Annotated, Union

from fastapi import Cookie, FastAPI
from pydantic import BaseModel

app = FastAPI()


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

    session_id: str
    fatebook_tracker: Union[str, None] = None
    googall_tracker: Union[str, None] = None


@app.get("/items/")
async def read_items(cookies: Annotated[Cookies, Cookie()]):
    return cookies
🤓 Other versions and variants
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
from typing import Union

from fastapi import Cookie, FastAPI
from pydantic import BaseModel
from typing_extensions import Annotated

app = FastAPI()


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

    session_id: str
    fatebook_tracker: Union[str, None] = None
    googall_tracker: Union[str, None] = None


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

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

Tip

Prefer to use the Annotated version if possible.

from typing import Union

from fastapi import Cookie, FastAPI
from pydantic import BaseModel

app = FastAPI()


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

    session_id: str
    fatebook_tracker: Union[str, None] = None
    googall_tracker: Union[str, None] = None


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

Якщо клієнт спробує надіслати якісь додаткові cookie, він отримає відповідь з помилкою.

Бідні банери cookie, які так старанно намагаються отримати Вашу згоду, щоб API її відхилила. 🍪

Наприклад, якщо клієнт спробує надіслати cookie santa_tracker зі значенням good-list-please, він отримає відповідь з помилкою, яка повідомить, що cookie santa_tracker не дозволено:

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

Підсумок

Ви можете використовувати Pydantic-моделі для оголошення cookie у FastAPI. 😎