Aller au contenu

Modèles de paramètres de requête

AI coding agents

Use the official FastAPI skill for your installed version. Install it from your project directory:

uvx library-skills

See Develop with AI.

🌐 Traduction par IA et humains

Cette traduction a été réalisée par une IA guidée par des humains. 🤝

Elle peut contenir des erreurs d'interprétation du sens original, ou paraître peu naturelle, etc. 🤖

Vous pouvez améliorer cette traduction en nous aidant à mieux guider le LLM d'IA.

Version anglaise

Si vous avez un groupe de paramètres de requête liés, vous pouvez créer un modèle Pydantic pour les déclarer.

Cela vous permet de réutiliser le modèle à plusieurs endroits et aussi de déclarer des validations et des métadonnées pour tous les paramètres en une seule fois. 😎

Remarque

Pris en charge depuis FastAPI version 0.115.0. 🤓

Déclarer des paramètres de requête avec un modèle Pydantic

Déclarez les paramètres de requête dont vous avez besoin dans un modèle Pydantic, puis déclarez le paramètre en tant que Query :

from typing import Annotated, Literal

from fastapi import FastAPI, Query
from pydantic import BaseModel, Field

app = FastAPI()


class FilterParams(BaseModel):
    limit: int = Field(100, gt=0, le=100)
    offset: int = Field(0, ge=0)
    order_by: Literal["created_at", "updated_at"] = "created_at"
    tags: list[str] = []


@app.get("/items/")
async def read_items(filter_query: Annotated[FilterParams, Query()]):
    return filter_query
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

from typing import Literal

from fastapi import FastAPI, Query
from pydantic import BaseModel, Field

app = FastAPI()


class FilterParams(BaseModel):
    limit: int = Field(100, gt=0, le=100)
    offset: int = Field(0, ge=0)
    order_by: Literal["created_at", "updated_at"] = "created_at"
    tags: list[str] = []


@app.get("/items/")
async def read_items(filter_query: FilterParams = Query()):
    return filter_query

FastAPI extrait les données pour chaque champ à partir des paramètres de requête de la requête et vous fournit le modèle Pydantic que vous avez défini.

Consultez les documents

Vous pouvez voir les paramètres de requête dans l'interface des documents à /docs :

Interdisez des paramètres de requête supplémentaires

Dans certains cas d'utilisation particuliers (probablement peu courants), vous pouvez vouloir restreindre les paramètres de requête que vous souhaitez recevoir.

Vous pouvez utiliser la configuration du modèle Pydantic pour forbid tout champ extra :

from typing import Annotated, Literal

from fastapi import FastAPI, Query
from pydantic import BaseModel, Field

app = FastAPI()


class FilterParams(BaseModel):
    model_config = {"extra": "forbid"}

    limit: int = Field(100, gt=0, le=100)
    offset: int = Field(0, ge=0)
    order_by: Literal["created_at", "updated_at"] = "created_at"
    tags: list[str] = []


@app.get("/items/")
async def read_items(filter_query: Annotated[FilterParams, Query()]):
    return filter_query
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

from typing import Literal

from fastapi import FastAPI, Query
from pydantic import BaseModel, Field

app = FastAPI()


class FilterParams(BaseModel):
    model_config = {"extra": "forbid"}

    limit: int = Field(100, gt=0, le=100)
    offset: int = Field(0, ge=0)
    order_by: Literal["created_at", "updated_at"] = "created_at"
    tags: list[str] = []


@app.get("/items/")
async def read_items(filter_query: FilterParams = Query()):
    return filter_query

Si un client tente d'envoyer des données supplémentaires dans les paramètres de requête, il recevra une réponse d'erreur.

Par exemple, si le client tente d'envoyer un paramètre de requête tool avec la valeur plumbus, comme :

https://example.com/items/?limit=10&tool=plumbus

Il recevra une réponse d'erreur lui indiquant que le paramètre de requête tool n'est pas autorisé :

{
    "detail": [
        {
            "type": "extra_forbidden",
            "loc": ["query", "tool"],
            "msg": "Extra inputs are not permitted",
            "input": "plumbus"
        }
    ]
}

Combinez des modèles de paramètres

Vous pouvez déclarer plusieurs modèles de paramètres de requête et les combiner avec des paramètres de requête individuels ou des dépendances.

from typing import Annotated

from fastapi import FastAPI, Query
from pydantic import BaseModel, Field

app = FastAPI()


class Pagination(BaseModel):
    limit: int = Field(10, ge=1)
    offset: int = Field(0, ge=0)


class Filters(BaseModel):
    tags: list[str] = []


@app.get("/items/")
def read_items(
    pagination: Annotated[Pagination, Query()],
    filters: Annotated[Filters, Query()],
    search: str | None = None,
):
    return {"pagination": pagination, "filters": filters, "search": search}
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

from fastapi import FastAPI, Query
from pydantic import BaseModel, Field

app = FastAPI()


class Pagination(BaseModel):
    limit: int = Field(10, ge=1)
    offset: int = Field(0, ge=0)


class Filters(BaseModel):
    tags: list[str] = []


@app.get("/items/")
def read_items(
    pagination: Pagination = Query(),
    filters: Filters = Query(),
    search: str | None = None,
):
    return {"pagination": pagination, "filters": filters, "search": search}

Les paramètres de requête restent au même niveau.

https://example.com/items/?limit=5&offset=10&tags=red&tags=blue&search=shirt

Il n'y a pas de clés pagination ou filters dans la chaîne de requête. Chaque modèle valide les paramètres de requête indépendamment, avec ses propres valeurs par défaut, validateurs de champs et validateurs de modèle. Il en va de même lorsque les modèles ou les paramètres individuels sont déclarés dans des dépendances.

Si des modèles partagent un nom de paramètre ou un alias, chaque modèle valide ce paramètre de requête indépendamment. Utilisez des noms ou des alias distincts pour des valeurs indépendantes. OpenAPI ne répertorie un paramètre partagé qu'une seule fois, comme pour les paramètres partagés avec des dépendances ; les déclarations partagées doivent donc décrire le même type et les mêmes contraintes.

La configuration extra de chaque modèle s'applique à tous les paramètres de requête, y compris ceux déclarés dans d'autres modèles ou dépendances. Avec extra="forbid", tout paramètre extérieur à ce modèle est rejeté. Avec extra="allow", ces paramètres sont inclus en tant que champs supplémentaires du modèle.

Cela fonctionne aussi pour les modèles Header et Cookie.

Modèles de paramètres de requête optionnels

Déclarez un modèle de paramètres de requête avec | None et une valeur par défaut de None pour rendre le groupe optionnel.

from datetime import date
from typing import Annotated

from fastapi import FastAPI, Query
from pydantic import BaseModel

app = FastAPI()


class DateRange(BaseModel):
    start: date
    end: date


@app.get("/items/")
async def read_items(
    limit: int = 10,
    date_range: Annotated[DateRange | None, Query()] = None,
):
    return {"limit": limit, "date_range": date_range}
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

from datetime import date

from fastapi import FastAPI, Query
from pydantic import BaseModel

app = FastAPI()


class DateRange(BaseModel):
    start: date
    end: date


@app.get("/items/")
async def read_items(
    limit: int = 10,
    date_range: DateRange | None = Query(default=None),
):
    return {"limit": limit, "date_range": date_range}

Si ni start ni end n'est envoyé, date_range vaut None. Si l'un des deux est envoyé, FastAPI valide le modèle et exige les deux champs.

L'utilisation de | None sans valeur par défaut laisse le paramètre obligatoire.

Les paramètres supplémentaires suivent la configuration extra du modèle. Les paramètres supplémentaires ignorés ne rendent pas le modèle présent.

OpenAPI répertorie les champs du groupe individuellement et les marque comme optionnels.

Vous pouvez aussi déclarer des modèles de paramètres d'en-tête et des modèles de paramètres de cookie optionnels.

Résumé

Vous pouvez utiliser des modèles Pydantic pour déclarer des paramètres de requête dans FastAPI. 😎

Astuce

Alerte spoiler : vous pouvez aussi utiliser des modèles Pydantic pour déclarer des cookies et des en-têtes, mais vous lirez cela plus tard dans le tutoriel. 🤫