Avancé
🧠 Fondamentaux
30 XP
0 personnes ont réussi
Validation d'entrée avec Django validators
Django fournit un système de validators dans le module django.core.validators. Un validator est une fonction (ou un callable) qui recoit une valeur et leve une ValidationError si la valeur est invalide.
Par exemple :
from django.core.validators import validate_email from django.core.exceptions import ValidationError
try: validate_email('test@example.com') # OK, ne leve rien validate_email('pas-un-email') # Leve ValidationError except ValidationError as e: print(e.message)
Django fournit aussi des classes de validators parametrables : - MinLengthValidator(min_length) : vérifie qu'une chaine fait au moins min_length caracteres - RegexValidator(regex, message) : vérifie qu'une valeur correspond a un pattern regex
Écris une fonction validate_user_data(data) qui prend un dictionnaire et retourne un tuple (is_valid, errors) ou errors est un dictionnaire {champ: message}.
Regles a vérifier : - 'email' (obligatoire) : doit etre un email valide (utilise validate_email de Django) - 'username' (obligatoire) : doit faire au moins 3 caracteres (utilise MinLengthValidator) - 'age' (optionnel) : si present, doit etre un entier entre 13 et 120
Pour capturer les erreurs, utilise try/except ValidationError.
Exemple :
ok, errors = validate_user_data({'email': 'bad', 'username': 'ab'}) ok vaut False, errors contient des messages pour email et username
Tests (4/5)
Données valides
ok, errors = validate_user_data({'email': 'alice@example.com', 'username': 'alice'})
assert ok == True and errors == {}
Email invalide
ok, errors = validate_user_data({'email': 'pas-valide', 'username': 'alice'})
assert ok == False and 'email' in errors
Username trop court
ok, errors = validate_user_data({'email': 'a@b.com', 'username': 'ab'})
assert ok == False and 'username' in errors
Age hors limites
ok, errors = validate_user_data({'email': 'a@b.com', 'username': 'alice', 'age': 10})
assert ok == False and 'age' in errors
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
import django
from django.conf import settings
if not settings.configured:
settings.configure(
DATABASES={},
INSTALLED_APPS=['django.contrib.contenttypes'],
DEFAULT_AUTO_FIELD='django.db.models.BigAutoField',
)
django.setup()
from django.core.validators import validate_email, MinLengthValidator
from django.core.exceptions import ValidationError
def validate_user_data(data):
errors = {}
email = data.get('email')
if not email:
errors['email'] = 'Ce champ est obligatoire'
else:
try:
validate_email(email)
except ValidationError:
errors['email'] = 'Email invalide'
username = data.get('username')
if not username:
errors['username'] = 'Ce champ est obligatoire'
else:
try:
MinLengthValidator(3)(username)
except ValidationError:
errors['username'] = 'Minimum 3 caracteres'
age = data.get('age')
if age is not None:
if not isinstance(age, int) or age < 13 or age > 120:
errors['age'] = 'Age invalide (entre 13 et 120)'
if errors:
return (False, errors)
return (True, {})