Cookie 参数模型¶
如果您有一组相关的 **Cookie**,您可以创建一个 **Pydantic 模型** 来声明它们。 🍪
这将允许您在 **多个地方** **重复使用模型**,并为所有参数一次性声明验证和元数据。 😎
注意
这在 FastAPI 版本 0.115.0
及更高版本中受支持。 🤓
提示
此技巧适用于 Query
、Cookie
和 Header
。 😎
使用 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**。 😎