コンテンツへスキップ

Cookie パラメーターモデル

関連するCookieのグループがある場合は、それらを宣言するためにPydantic モデルを作成できます。 🍪

これにより、モデルを複数の場所で再利用したり、すべてのパラメータの検証とメタデータを一度に宣言したりできます。😎

Note

これはFastAPIバージョン0.115.0以降でサポートされています。🤓

ヒント

この同じテクニックは、QueryCookie、およびHeaderに適用されます。 😎

Pydantic モデルを使用した Cookie

必要なCookieパラメーターをPydantic モデルで宣言し、そのパラメーターを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 モデルを返します。

ドキュメントを確認

定義された Cookie は、/docsのドキュメント UI で確認できます。

情報

ブラウザが Cookie を特別かつ舞台裏で処理するため、JavaScriptがそれらに触れることを容易には許可しないことに注意してください。

/docsAPI ドキュメント UIにアクセスすると、パス操作の Cookie のドキュメントを見ることができます。

しかし、データを入力して「Execute」をクリックしても、ドキュメント UI はJavaScriptで動作するため、Cookie は送信されず、値を入力しなかったかのようなエラーメッセージが表示されます。

追加の Cookie を禁止する

いくつかの特別なユースケース(おそらくあまり一般的ではありません)では、受け取りたい Cookie を制限したい場合があります。

あなたの API は、独自のCookie 同意を制御する力を持ちました。🤪🍪

Pydanticのモデル設定を使用して、extraフィールドをforbidすることができます。

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 に拒否される同意を得ようとします。🍪

たとえば、クライアントがsanta_trackerという Cookie をgood-list-pleaseという値で送信しようとすると、クライアントは、santa_trackerCookie は許可されていないというエラー応答を受け取ります。

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

概要

Pydantic モデルを使用して、FastAPI でCookieを宣言できます。 😎