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.