Flash Messages

Utilisation dans les handlers

Pattern avec redirection (messages flash)

pub async fn soumission_inscription(mut request: Request) -> AppResult<Response> {
    let form: RegisterForm = request.form();

    let mut validated = match ValidationForm::try_new(form, &request).await {
        Ok(validated) => validated,
        Err(form) => {
            // ❌ Validation échouée → message immédiat (pas de redirect)
            context_update!(request => {
                "title" => "Erreur de validation",
                "inscription_form" => &form,
                "messages" => flash_now!(error => "Veuillez corriger les erreurs"),
            });
            return request.render("inscription_form.html");
        }
    };

    let user = validated.save(&request.engine.db).await.map_err(|err| {
        validated.database_error(&err);
        AppError::from(err)
    })?;

    // ✅ Message flash → affiché après le redirect
    success!(request.notices => format!(
        "Bienvenue {}, votre compte est créé !",
        user.username
    ));
    Ok(Redirect::to("/").into_response())
}

Plusieurs types de messages

pub async fn about(mut request: Request) -> AppResult<Response> {
    success!(request.notices => "Ceci est un message de succès.");
    info!(request.notices => "Ceci est un message d'information.");
    warning!(request.notices => "Ceci est un message d'avertissement.");
    error!(request.notices => "Ceci est un message d'erreur.");

    context_update!(request => {
        "title" => "À propos",
    });
    request.render("about/about.html")
}

Comportement flash (une seule lecture)

Les messages flash stockés en session sont consommés automatiquement lors de l'affichage :

1. POST /inscription
   → success!("Bienvenue !")
   → Redirect::to("/")

2. GET /
   → Les messages sont lus depuis la session
   → Affichés dans le template
   → Supprimés de la session

3. GET / (reload)
   → Plus de messages (déjà consommés)