Aller au contenu

Premier formulaire POST

Objectif : recevoir les données d'un formulaire envoyé en POST et les lire côté serveur.

Ce que vous allez apprendre : afficher un formulaire, le soumettre en POST, et lire un champ avec request.form("name", default=...), le POST étant protégé par le jeton CSRF du palier précédent.

WelcomeController porte déjà les méthodes des paliers précédents, dont la méthode privée _start_session introduite au palier CSRF, et mvc/routes.py déclare les routes jusqu'à /welcome/csrf.

Nous ajoutons deux méthodes (afficher le formulaire, traiter l'envoi), deux routes et un gabarit.

Documentations

Pour bien comprendre ce palier :

Document Ce qu'il apporte
L'objet Request l'accesseur form(...) pour lire les champs d'un POST
La protection CSRF pourquoi le champ caché csrf_token est requis
La session HTTP où vit le jeton réutilisé par _start_session
Contrôleurs

Ajoutez ces deux méthodes à la classe WelcomeController.
Comme ce formulaire fait un vrai POST protégé, form réutilise _start_session (garantir la session, donc un jeton non vide) et pose le cookie de session :

    @staticmethod
    def form(request: Request) -> Response:
        session_id, csrf_token = WelcomeController._start_session(request)
        response = BaseController.render(
            "welcome/form_post.html",
            request=request,
            context={"csrf_token": csrf_token},
        )
        set_session_cookie(response, session_id)
        return response

    @staticmethod
    def form_submit(request: Request) -> Response:
        name = request.form("name", default="Forge")
        return Response.text(f"Bonjour {name}")
Élément Rôle
request.form("name", default="Forge") Lit un champ du corps du formulaire, là où request.query(...) lisait la chaîne de requête.
_start_session(request) Garantit une session active et renvoie un jeton CSRF non vide (méthode introduite au palier CSRF).
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")

Deux routes encadrent le formulaire : GET /welcome/form l'affiche, POST /welcome/form-submit traite l'envoi.

Vues

Créez le gabarit mvc/views/welcome/form_post.html :

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="utf-8">
    <title>Premier formulaire POST</title>
</head>
<body>
    <h1>Premier formulaire POST</h1>
    <form method="post" action="/welcome/form-submit">
        <input type="hidden" name="csrf_token" value="{{ csrf_token }}">
        <label>Prénom : <input type="text" name="name" value="Forge"></label>
        <button type="submit">Envoyer</button>
    </form>
</body>
</html>

Le champ caché csrf_token permet au POST de passer la protection CSRF du groupe public.

Tests
URL Résultat
https://localhost:8000/welcome/form le formulaire avec le champ prénom
Soumettre avec Roger Bonjour Roger
Soumettre en laissant Forge Bonjour Forge
À retenir
  • request.form(cle, default=...) lit un champ envoyé en POST.
  • Un même formulaire s'appuie sur deux routes : GET (afficher) et POST (traiter).
  • Le champ caché csrf_token est requis pour que le POST soit accepté.
Astuces

Les appels session (_start_session, set_session_cookie) reviennent à chaque formulaire protégé.
Si vous voulez simplifier, vous pouvez les regrouper dans une classe façade de votre application, sous mvc/helpers/.

Forge ne l'ajoute pas au framework : le noyau reste minimal et explicite, l'ergonomie est à votre main.
Un parcours dédié vous montre comment construire ces façades pas à pas (Session, Cookies, Flash) : Construire vos façades helper.

Au palier suivant, nous refusons une saisie invalide côté serveur.

Continuer avec Validation serveur