Validation serveur¶
Objectif : refuser une saisie invalide côté serveur, sans jamais faire confiance aveuglément au navigateur.
Ce que vous allez apprendre : nettoyer une valeur avec .strip() et renvoyer une réponse d'erreur avec un statut HTTP 422 quand la saisie est vide.
WelcomeController porte déjà les méthodes des paliers précédents, et mvc/routes.py déclare les routes jusqu'à /welcome/form.
Nous ajoutons deux méthodes, deux routes et un gabarit.
Documentations
Pour bien comprendre ce palier :
| Document | Ce qu'il apporte |
|---|---|
| L'objet Request | l'accesseur form(...) pour lire la saisie |
| L'objet Response | comment fixer un statut HTTP, ici 422 |
| La protection CSRF | le champ caché csrf_token toujours requis |
Contrôleurs
Ajoutez ces deux méthodes à la classe WelcomeController :
@staticmethod
def validate(request: Request) -> Response:
session_id, csrf_token = WelcomeController._start_session(request)
response = BaseController.render(
"welcome/server_validation.html",
request=request,
context={"csrf_token": csrf_token},
)
set_session_cookie(response, session_id)
return response
@staticmethod
def validate_submit(request: Request) -> Response:
name = request.form("name", default="").strip()
if not name:
return Response.text("Le prénom est obligatoire", status=422)
return Response.text(f"Bonjour {name}")
| Élément | Rôle |
|---|---|
.strip() |
Retire les espaces de début et de fin : une saisie qui ne contient que des espaces devient une chaîne vide. |
if not name: |
Détecte la saisie vide et renvoie une erreur explicite. |
status=422 |
« Contenu non traitable » : signale au client que la donnée est invalide, sans planter ni accepter une valeur fausse. |
Routes
Ajoutez les deux routes (GET et POST) dans le groupe public de mvc/routes.py :
# mvc/routes.py
from core.http.router import Router
from mvc.controllers.home_controller import HomeController
from mvc.controllers.welcome_controller import WelcomeController
router = Router()
with router.group("", public=True) as public:
public.add("GET", "/", HomeController.index, name="home-index")
public.add("GET", "/welcome", WelcomeController.index, name="welcome-index")
public.add("GET", "/welcome/hello", WelcomeController.hello, name="welcome-hello")
public.add("GET", "/welcome/html", WelcomeController.html, name="welcome-html")
public.add("GET", "/welcome/article/{id}", WelcomeController.article, name="welcome-article")
public.add("GET", "/welcome/debug", WelcomeController.debug, name="welcome-debug")
public.add("GET", "/welcome/json", WelcomeController.json_demo, name="welcome-json")
public.add("GET", "/welcome/csrf", WelcomeController.csrf, name="welcome-csrf")
public.add("GET", "/welcome/form", WelcomeController.form, name="welcome-form")
public.add("POST", "/welcome/form-submit", WelcomeController.form_submit, name="welcome-form_submit")
public.add("GET", "/welcome/validate", WelcomeController.validate, name="welcome-validate")
public.add("POST", "/welcome/validate-submit", WelcomeController.validate_submit, name="welcome-validate_submit")
Vues
Créez le gabarit mvc/views/welcome/server_validation.html :
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Validation serveur</title>
</head>
<body>
<h1>Validation serveur</h1>
<form method="post" action="/welcome/validate-submit">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
<label>Prénom : <input type="text" name="name" value=""></label>
<button type="submit">Envoyer</button>
</form>
</body>
</html>
Le champ prénom part vide : c'est ce qui permet de déclencher l'erreur de validation.
Tests
| URL | Résultat |
|---|---|
https://localhost:8000/welcome/validate |
le formulaire avec un champ prénom vide |
Soumettre avec Roger |
Bonjour Roger |
| Soumettre vide ou avec des espaces | Le prénom est obligatoire (statut 422) |
À retenir
- La validation se fait toujours côté serveur, jamais seulement dans le navigateur.
.strip()neutralise les saisies qui ne sont que des espaces.- Le statut
422exprime une donnée invalide de façon claire.
Au palier suivant, nous lisons pour la première fois des données en base SQL.