跳至内容

Cookie 参数模型

如果您有一组相关的 **Cookie**,您可以创建一个 **Pydantic 模型** 来声明它们。 🍪

这将允许您在 **多个地方** **重复使用模型**,并为所有参数一次性声明验证和元数据。 😎

注意

这在 FastAPI 版本 0.115.0 及更高版本中受支持。 🤓

提示

此技巧适用于 QueryCookieHeader。 😎

使用 Pydantic 模型的 Cookie

在 **Pydantic 模型** 中声明您需要的 **Cookie** 参数,然后将参数声明为 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
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

提示

如果可能,建议使用 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: Cookies = Cookie()):
    return cookies

提示

如果可能,建议使用 Annotated 版本。

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 模型。

查看文档

您可以在 /docs 上的文档 UI 中查看定义的 Cookie

信息

请注意,由于 **浏览器以特殊方式处理 Cookie**,并且在幕后,它们 **不允许** **JavaScript** 轻松地触碰它们。

如果您转到 /docs 上的 **API 文档 UI**,您将能够看到您的路径操作的 Cookie **文档**。

但即使您 **填写数据** 并点击“执行”,由于文档 UI 使用 **JavaScript**,Cookie 不会被发送,您将看到一条 **错误** 消息,就好像您没有输入任何值一样。

禁止额外 Cookie

在一些特殊情况下 (可能并不常见),您可能希望 **限制** 您想要接收的 Cookie。

您的 API 现在有能力控制自己的 Cookie 同意。 🤪🍪

您可以使用 Pydantic 的模型配置来 forbid 任何 extra 字段

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
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

提示

如果可能,建议使用 Annotated 版本。

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**,他们将收到一个 **错误** 响应。

所有努力获得您 同意 API 拒绝它 的可怜的 Cookie 横幅。 🍪

例如,如果客户端尝试发送一个名为 santa_tracker,值为 good-list-please 的 Cookie,客户端将收到一个 **错误** 响应,告诉他们 santa_tracker Cookie 不允许

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

摘要

您可以在 **FastAPI** 中使用 **Pydantic 模型** 来声明 **Cookie**。 😎