Cookieパラメーターモデル¶
関連するクッキーのグループがある場合は、それらを宣言するためにPydanticモデルを作成できます。🍪
これにより、モデルを複数の場所で再利用したり、すべてのパラメータの検証とメタデータを一度に宣言したりできます。😎
注記
これはFastAPIバージョン0.115.0
以降でサポートされています。🤓
ヒント
この同じテクニックはQuery
、Cookie
、および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でクッキーを宣言することができます。😎