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 的模型設定來禁止
任何額外
的欄位
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,他們將收到錯誤回應。
可憐的 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。😎