コンテンツへスキップ

Cookie パラメータモデル

関連するCookieのグループがある場合は、Pydantic モデルを作成して宣言できます。🍪

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

注記

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

ヒント

このテクニックは、QueryCookieHeaderにも適用できます。😎

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 モデルを提供します。

ドキュメントを参照

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

情報

ブラウザはCookieを特別な方法でバックグラウンドで処理するため、JavaScriptが簡単にアクセスできないことに注意してください。

/docsAPI ドキュメントUIにアクセスすると、パスオペレーションのCookieのドキュメントを確認できます。

しかし、データを入力して「実行」をクリックしても、ドキュメントUIはJavaScriptを使用しているため、Cookieは送信されず、値を入力しなかった場合と同じエラーメッセージが表示されます。

余分な Cookie の禁止

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

API は独自のCookie同意を制御できるようになりました。🤪🍪

Pydantic のモデル設定を使用して、余分なフィールドを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 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を送信しようとすると、エラーレスポンスを受け取ります。

すべての努力をしてAPIが拒否するためのCookieバナーがかわいそうです。🍪

たとえば、クライアントが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 モデルを使用して、FastAPICookieを宣言できます。😎