跳至內容

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 觸及它們。

如果您前往 /docsAPI 文件 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-pleasesanta_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。😎