Cookie パラメータモデル¶
関連する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は、リクエストで受信したCookieから各フィールドのデータを抽出し、定義した Pydantic モデルを提供します。
ドキュメントを参照¶
/docs
のドキュメントUIで定義されたCookieを確認できます。

情報
ブラウザはCookieを特別な方法でバックグラウンドで処理するため、JavaScriptが簡単にアクセスできないことに注意してください。
/docs
のAPI ドキュメント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_tracker
Cookieは許可されていませんというエラーレスポンスを受け取ります。
{
"detail": [
{
"type": "extra_forbidden",
"loc": ["cookie", "santa_tracker"],
"msg": "Extra inputs are not permitted",
"input": "good-list-please",
}
]
}
まとめ¶
Pydantic モデルを使用して、FastAPIでCookieを宣言できます。😎