Modèles de paramètres d'en-tête¶
🌐 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.
Si vous avez un groupe de paramètres d'en-tê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
Cela est pris en charge depuis la version 0.115.0 de FastAPI. 🤓
Paramètres d'en-tête avec un modèle Pydantic¶
Déclarez les paramètres d'en-tête dont vous avez besoin dans un modèle Pydantic, puis déclarez le paramètre comme Header :
from typing import Annotated
from fastapi import FastAPI, Header
from pydantic import BaseModel
app = FastAPI()
class CommonHeaders(BaseModel):
host: str
save_data: bool
if_modified_since: str | None = None
traceparent: str | None = None
x_tag: list[str] = []
@app.get("/items/")
async def read_items(headers: Annotated[CommonHeaders, Header()]):
return headers
🤓 Other versions and variants
Tip
Prefer to use the Annotated version if possible.
from fastapi import FastAPI, Header
from pydantic import BaseModel
app = FastAPI()
class CommonHeaders(BaseModel):
host: str
save_data: bool
if_modified_since: str | None = None
traceparent: str | None = None
x_tag: list[str] = []
@app.get("/items/")
async def read_items(headers: CommonHeaders = Header()):
return headers
FastAPI extrait les données de chaque champ depuis les en-têtes de la requête et vous fournit le modèle Pydantic que vous avez défini.
Consulter la documentation¶
Vous pouvez voir les en-têtes requis dans l'interface de la documentation à /docs :
Interdire les en-têtes supplémentaires¶
Dans certains cas d'utilisation particuliers (probablement pas très courants), vous pourriez vouloir restreindre les en-têtes que vous souhaitez recevoir.
Vous pouvez utiliser la configuration du modèle de Pydantic pour forbid tout champ extra :
from typing import Annotated
from fastapi import FastAPI, Header
from pydantic import BaseModel
app = FastAPI()
class CommonHeaders(BaseModel):
model_config = {"extra": "forbid"}
host: str
save_data: bool
if_modified_since: str | None = None
traceparent: str | None = None
x_tag: list[str] = []
@app.get("/items/")
async def read_items(headers: Annotated[CommonHeaders, Header()]):
return headers
🤓 Other versions and variants
Tip
Prefer to use the Annotated version if possible.
from fastapi import FastAPI, Header
from pydantic import BaseModel
app = FastAPI()
class CommonHeaders(BaseModel):
model_config = {"extra": "forbid"}
host: str
save_data: bool
if_modified_since: str | None = None
traceparent: str | None = None
x_tag: list[str] = []
@app.get("/items/")
async def read_items(headers: CommonHeaders = Header()):
return headers
Si un client essaie d'envoyer des en-têtes supplémentaires, il recevra une réponse d'erreur.
Par exemple, si le client essaie d'envoyer un en-tête tool avec la valeur plumbus, il recevra une réponse d'erreur lui indiquant que le paramètre d'en-tête tool n'est pas autorisé :
{
"detail": [
{
"type": "extra_forbidden",
"loc": ["header", "tool"],
"msg": "Extra inputs are not permitted",
"input": "plumbus",
}
]
}
Désactiver convert_underscores¶
Comme pour les paramètres d'en-tête classiques, lorsque vous avez des caractères de soulignement dans les noms de paramètres, ils sont automatiquement convertis en tirets.
Par exemple, si vous avez un paramètre d'en-tête save_data dans le code, l'en-tête HTTP attendu sera save-data, et il apparaîtra ainsi dans la documentation.
Si, pour une raison quelconque, vous devez désactiver cette conversion automatique, vous pouvez aussi le faire pour les modèles Pydantic de paramètres d'en-tête.
from typing import Annotated
from fastapi import FastAPI, Header
from pydantic import BaseModel
app = FastAPI()
class CommonHeaders(BaseModel):
host: str
save_data: bool
if_modified_since: str | None = None
traceparent: str | None = None
x_tag: list[str] = []
@app.get("/items/")
async def read_items(
headers: Annotated[CommonHeaders, Header(convert_underscores=False)],
):
return headers
🤓 Other versions and variants
Tip
Prefer to use the Annotated version if possible.
from fastapi import FastAPI, Header
from pydantic import BaseModel
app = FastAPI()
class CommonHeaders(BaseModel):
host: str
save_data: bool
if_modified_since: str | None = None
traceparent: str | None = None
x_tag: list[str] = []
@app.get("/items/")
async def read_items(headers: CommonHeaders = Header(convert_underscores=False)):
return headers
Alertes
Avant de définir convert_underscores à False, gardez à l'esprit que certains proxys et serveurs HTTP interdisent l'utilisation d'en-têtes contenant des underscores.
Résumé¶
Vous pouvez utiliser des modèles Pydantic pour déclarer des en-têtes dans FastAPI. 😎