La façade Flash¶
Objectif : regrouper les messages flash (un message affiché une seule fois, puis consommé) sous une façade Flash.
Ce que vous allez apprendre : poser un message flash dans la session et le lire ; comprendre pourquoi le flash est une préoccupation distincte de la session brute, même s'il vit dans la session.
Là où nous en sommes¶
Vous avez _facade.py, session.py et cookies.py.
Nous ajoutons la dernière façade du parcours.
L'ajout¶
Créez mvc/helpers/flash.py :
# mvc/helpers/flash.py
"""Façade de confort pour les messages flash (helper applicatif)."""
from core.security.session import get_flash as _get_flash
from core.security.session import set_flash as _set_flash
from mvc.helpers._facade import Facade
class Flash(Facade):
@staticmethod
def set(session_id: str, message: str, level: str = "success") -> None:
_set_flash(session_id, message, level)
@staticmethod
def get(session_id: str) -> dict | None:
return _get_flash(session_id)
Comprendre ce code¶
- Un message flash est un message à usage unique : on le pose lors d'une action (« Enregistré », « Erreur »), il est affiché au chargement suivant, puis supprimé automatiquement.
C'est le motif classique après un POST/redirect. setstocke{message, level}dans la session ;level("success","error","warning"…) sert à choisir le style d'affichage.getlit et supprime le message d'un coup (lecture one-shot) : un secondgetrenvoieNone.
C'est ce qui garantit qu'il n'apparaît qu'une fois.- Pourquoi une façade à part : le flash vit dans la session, mais c'est une préoccupation différente (un message UI éphémère, pas l'état de session).
Le séparer deSessiongarde chaque façade centrée sur un seul rôle ; c'est aussi pour ça qu'on ne l'avait pas mis dansSession. - Le flash a besoin d'une session existante : on lui passe le
session_id(obtenu viaSession.current_id/Session.new).
Tester¶
Dans un shell Python du projet :
>>> from mvc.helpers.session import Session
>>> from mvc.helpers.flash import Flash
>>> sid = Session.new()
>>> Flash.set(sid, "Enregistré", "success")
>>> Flash.get(sid)
{'message': 'Enregistré', 'level': 'success'}
>>> Flash.get(sid) # déjà consommé : plus rien
>>>
Le second appel ne renvoie rien (None) : le message est à usage unique.
À retenir¶
Flashgère des messages à usage unique :setpose,getlit et supprime.- Le flash vit dans la session, mais reste une façade distincte (un rôle = une façade).
- Il exige un
session_id, fourni parSession.
Au palier suivant, nous câblons tout : l'import unique et l'usage en contrôleur.