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 文档。
但是,即使你填写数据并点击“Execute”,由于文档 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 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
提示
如果可能,请优先使用 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: 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,它们将收到一个错误响应。
可怜的 cookie 横幅,费尽心思想获得你的同意,结果却被 API 拒绝了。🍪
例如,如果客户端尝试发送一个值为 good-list-please
的 santa_tracker
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。😎