Flask-Jeroboam valide automatiquement les requêtes entrantes en fonction de vos signatures de fonction et de vos modèles Pydantic. Ce guide montre des modèles courants pour valider différents types de données de requête.
Par défaut, les requêtes GET utilisent des paramètres de requête et les requêtes POST utilisent des paramètres de corps de requête. Si vous devez les mélanger, soyez explicite :
fromflask_jeroboamimportQuery,Body@app.post("/items")defcreate_item(# Paramètre de requête (explicite)category:str=Query(...),# Paramètres du corps (implicite pour POST)name:str=Body(...),description:str=Body(...)):return{"name":name,"description":description,"category":category}
Pour les structures complexes, utilisez des modèles Pydantic. Cela ajoute une validation de schéma :
frompydanticimportBaseModel,FieldclassItemCreate(BaseModel):name:strdescription:str=Noneprice:float=Field(...,gt=0)# Doit être supérieur à 0@app.post("/items")defcreate_item(item:ItemCreate):# item est validé et fournit l'autocomplétion de l'IDEreturn{"created":item.name}
Ajoutez des règles de validation directement dans votre modèle :
frompydanticimportField,EmailStrclassUserCreate(BaseModel):email:EmailStr# Automatiquement validé en tant que courrier électroniqueage:int=Field(...,ge=18,le=120)# Plage 18-120username:str=Field(...,min_length=3,max_length=20)bio:str=Field("",max_length=500)
Essayez de créer un utilisateur avec des données invalides :
$curl-XPOSThttp://localhost:5000/users\-H"Content-Type: application/json"\-d'{"email": "not-an-email", "age": 15}'{"detail":[{"loc":["body","email"],"msg":"value is not a valid email address"},{"loc":["body","age"],"msg":"Input should be greater than or equal to 18"}]}
Validez les en-têtes personnalisés ou les cookies de la même manière :
fromflask_jeroboamimportHeader,Cookie@app.get("/protected")defget_protected(x_token:str=Header(...),session_id:str=Cookie(...)):# Les deux sont validés automatiquementreturn{"token":x_token}
Utilisez les validateurs de Pydantic pour ajouter une logique personnalisée :
frompydanticimportBaseModel,field_validatorclassEventCreate(BaseModel):name:strstart_date:strend_date:str@field_validator('end_date')@classmethoddefend_after_start(cls,v,info):ifinfo.data.get('start_date')andv<info.data.get('start_date'):raiseValueError('end_date must be after start_date')returnv
Cela garantit que end_date est toujours après start_date, même si les deux dates sont individuellement valides.
Rendez les champs optionnels en utilisant None comme défaut :
fromtypingimportOptionalclassItemFilter(BaseModel):category:Optional[str]=Nonemin_price:Optional[float]=Nonemax_price:Optional[float]=None@app.get("/items")defsearch_items(filter:ItemFilter):# Tous les champs sont optionnelsreturnsearch(filter)
Comment valider les données de requête¶
Flask-Jeroboam valide automatiquement les requêtes entrantes en fonction de vos signatures de fonction et de vos modèles Pydantic. Ce guide montre des modèles courants pour valider différents types de données de requête.
Paramètres scalaires simples¶
Pour les valeurs uniques, utilisez les indices de type directement sur les arguments de la fonction :
Essayez de passer des valeurs invalides pour voir les réponses d’erreur automatiques :
Paramètres de requête vs body¶
Par défaut, les requêtes GET utilisent des paramètres de requête et les requêtes POST utilisent des paramètres de corps de requête. Si vous devez les mélanger, soyez explicite :
Utiliser des modèles Pydantic¶
Pour les structures complexes, utilisez des modèles Pydantic. Cela ajoute une validation de schéma :
Contraintes de champ¶
Ajoutez des règles de validation directement dans votre modèle :
Essayez de créer un utilisateur avec des données invalides :
Paramètres de chemin¶
Les paramètres de chemin sont détectés automatiquement à partir de la règle d’URL. Aucun travail supplémentaire nécessaire :
En-têtes et cookies¶
Validez les en-têtes personnalisés ou les cookies de la même manière :
Validation conditionnelle¶
Utilisez les validateurs de Pydantic pour ajouter une logique personnalisée :
Cela garantit que end_date est toujours après start_date, même si les deux dates sont individuellement valides.
Champs optionnels¶
Rendez les champs optionnels en utilisant None comme défaut :