Aller au contenu

Messages flash

Objectif : confirmer une action par un message qui s'affiche une seule fois, à la requête suivante.

Ce que vous allez apprendre : le motif POST-Redirect-GET complet. Une action POST pose un message flash puis redirige ; la page cible lit le flash (get_flash, qui le supprime aussitôt) et l'affiche.

La modification ré-affiche la page d'édition, et la suppression redirige sans confirmation.

Nous donnons à ces deux écritures un vrai retour utilisateur : un message de confirmation one-shot, posé avant la redirection et affiché sur la liste.

Documentations

Pour bien comprendre ce palier :

Document Ce qu'il apporte
La session HTTP où le flash est stocké entre deux requêtes
L'objet Response la redirection qui suit le POST
Contrôleurs

Dans mvc/controllers/note_controller.py, faites poser un flash par update et delete au moment de rediriger, et lisez le flash dans index.

from core.security.session import get_flash, get_session, get_session_id


class NoteController(BaseController):

    @staticmethod
    def index(request: Request) -> Response:
        # … lecture de q, page, notes inchangée …
        session_id, csrf_token = NoteController._start_session(request)
        flash = get_flash(session_id)  # one-shot : disparaît à la lecture
        response = BaseController.render(
            "note/index.html",
            request=request,
            context={
                "notes": notes,
                "q": q,
                "page": page,
                "has_prev": page > 1,
                "has_next": page * PAGE_SIZE < total,
                "csrf_token": csrf_token,
                "flash": flash,
            },
        )
        set_session_cookie(response, session_id)
        return response

    @staticmethod
    def update(request: Request) -> Response:
        record_id = int(request.route("id", default="0"))
        content = request.form("content", default="").strip()
        if not content:
            return Response.text("Le contenu est obligatoire.", status=422)
        execute(UPDATE_ONE, (content, record_id))
        return BaseController.redirect("/note", request=request, flash="Note mise à jour.")

    @staticmethod
    def delete(request: Request) -> Response:
        record_id = int(request.route("id", default="0"))
        execute(DELETE_ONE, (record_id,))
        return BaseController.redirect("/note", request=request, flash="Note supprimée.")
Élément Rôle
redirect("/note", request=request, flash="…") Pose le message dans la session puis renvoie une redirection : le POST puis le Redirect du motif.
get_flash(session_id) Au GET suivant, lit le message et le supprime : il ne s'affiche donc qu'une fois, même en rechargeant.

update ne ré-affiche plus la page d'édition : il redirige vers la liste, état réel et partageable.

Vues

Affichez le flash en tête du bloc content de mvc/views/note/index.html :

{% if flash %}
<p><strong>{{ flash.message }}</strong></p>
{% endif %}
Routes

Inchangé : le flash réutilise les routes existantes (aucune route nouvelle).

# mvc/routes.py
from core.http.router import Router
from mvc.controllers.home_controller import HomeController
from mvc.controllers.note_controller import NoteController

router = Router()

with router.group("", public=True) as public:
    public.add("GET",  "/", HomeController.index, name="home-index")
    public.add("GET",  "/note", NoteController.index, name="note-index")
    public.add("GET",  "/note/edit/{id}", NoteController.edit, name="note-edit")
    public.add("POST", "/note/update/{id}", NoteController.update, name="note-update")
    public.add("POST", "/note/delete/{id}", NoteController.delete, name="note-delete")
Tests
Action Résultat
Modifier une note retour à la liste avec « Note mise à jour. »
Recharger la liste le message a disparu (one-shot)
Supprimer une note retour à la liste avec « Note supprimée. »
À retenir
  • POST-Redirect-GET : on redirige après une écriture, jamais on ne ré-affiche directement le POST.
  • Un flash est one-shot : get_flash le lit et le supprime.
  • Le flash combine session (stockage) et redirection.
Astuces

Le couple « poser un flash / le lire » se prête bien à une façade Flash de votre application, sous mvc/helpers/, qui masquerait get_flash et le passage du flash= au redirect.

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 mémorisons un état serveur entre les requêtes avec la session.

Continuer avec Mémoriser un état en session