Моделі для Cookie-параметрів¶
Якщо у Вас є група cookies параметрів, які пов'язані між собою, Ви можете створити Pydantic-модель, щоб оголосити їх. 🍪
Це дозволить Вам повторно використовувати модель у різних місцях, а також оголосити валідацію та метадані для всіх параметрів одночасно. 😎
Нотатки
Це підтримується з версії FastAPI 0.115.0
. 🤓
Порада
Ця ж техніка застосовується до Query
, Cookie
, та Header
. 😎
Cookie з Pydantic-моделлю¶
Оголосіть 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¶
У деяких спеціальних випадках (ймовірно, не дуже поширених) Ви можете захотіти обмежити список 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. 😎