Zum Inhalt

Cookie-Parameter-Modelle

Wenn Sie eine Gruppe von Cookies haben, die zusammengehören, können Sie ein Pydantic-Modell erstellen, um diese zu deklarieren. đŸȘ

Damit können Sie das Modell an mehreren Stellen wiederverwenden und auch Validierungen und Metadaten fĂŒr alle Parameter gleichzeitig deklarieren. 😎

Hinweis

Dies wird seit FastAPI Version 0.115.0 unterstĂŒtzt. đŸ€“

Tipp

Diese gleiche Technik gilt fĂŒr Query, Cookie und Header. 😎

Cookies mit einem Pydantic-Modell

Deklarieren Sie die Cookie-Parameter, die Sie benötigen, in einem Pydantic-Modell, und deklarieren Sie dann den Parameter als 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
đŸ€“ Other versions and variants
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

Tip

Prefer to use the Annotated version if possible.

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

Tip

Prefer to use the Annotated version if possible.

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 wird die Daten fĂŒr jedes Feld aus den im Request empfangenen Cookies extrahieren und Ihnen das von Ihnen definierte Pydantic-Modell bereitstellen.

Die Dokumentation testen

Sie können die definierten Cookies in der DokumentationsoberflÀche unter /docs sehen:

Info

Bitte beachten Sie, dass Browser Cookies auf spezielle Weise und im Hintergrund bearbeiten, sodass sie nicht leicht JavaScript erlauben, diese zu berĂŒhren.

Wenn Sie zur API-DokumentationsoberflĂ€che unter /docs gehen, können Sie die Dokumentation fĂŒr Cookies fĂŒr Ihre Pfadoperationen sehen.

Aber selbst wenn Sie die Daten ausfĂŒllen und auf „AusfĂŒhren“ klicken, werden aufgrund der Tatsache, dass die DokumentationsoberflĂ€che mit JavaScript arbeitet, die Cookies nicht gesendet, und Sie werden eine Fehlermeldung sehen, als ob Sie keine Werte eingegeben hĂ€tten.

ZusÀtzliche Cookies verbieten

In einigen speziellen AnwendungsfÀllen (wahrscheinlich nicht sehr hÀufig) möchten Sie möglicherweise die Cookies, die Sie empfangen möchten, einschrÀnken.

Ihre API hat jetzt die Macht, ihre eigene Cookie-Einwilligung zu kontrollieren. đŸ€ȘđŸȘ

Sie können die Modellkonfiguration von Pydantic verwenden, um extra Felder zu verbieten (forbid):

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
đŸ€“ Other versions and variants
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

Tip

Prefer to use the Annotated version if possible.

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

Tip

Prefer to use the Annotated version if possible.

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

Wenn ein Client versucht, einige zusÀtzliche Cookies zu senden, erhÀlt er eine Error-Response.

Arme Cookie-Banner, wie sie sich mĂŒhen, Ihre Einwilligung zu erhalten, dass die API sie ablehnen darf. đŸȘ

Wenn der Client beispielsweise versucht, ein santa_tracker-Cookie mit einem Wert von good-list-please zu senden, erhÀlt der Client eine Error-Response, die ihm mitteilt, dass das santa_tracker Cookie nicht erlaubt ist:

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

Zusammenfassung

Sie können Pydantic-Modelle verwenden, um Cookies in FastAPI zu deklarieren. 😎