コンテンツへスキップ

Cookieパラメーターモデル

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

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

注記

これは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は、リクエストで受信したクッキーから各フィールドのデータを抽出し、定義したPydanticモデルを提供します。

ドキュメントを確認

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

情報

ブラウザはクッキーを特別な方法で舞台裏で処理するため、JavaScriptでそれらを簡単に触ることはできません

/docsにあるAPIドキュメントUIにアクセスすると、パス操作のクッキーに関するドキュメントを見ることができます。

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

余分なCookieの禁止

いくつかの特殊な使用例(おそらく非常に一般的ではありませんが)では、受信したいクッキーを制限したい場合があります。

これであなたのAPIは、独自のクッキー同意を制御する力を持ちました。🤪🍪

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

クライアントが余分なクッキーを送信しようとすると、エラーレスポンスを受け取ります。

クライアントの同意を得るための努力にもかかわらず、APIに拒否される哀れなクッキーバナーたち。🍪

例えば、クライアントがsanta_trackerクッキーをgood-list-pleaseという値で送信しようとすると、クライアントはsanta_trackerクッキーは許可されていないというエラーレスポンスを受け取ります。

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

概要

Pydanticモデルを使用して、FastAPIクッキーを宣言することができます。😎