Aller au contenu principal

3 formations sont désormais disponibles : Python, Flask et JS.

Aller au contenu principal

Traiter la soumission & Feedback

Apprendre Flask : Le Guide Ultime
3 min de lecture
Gratuit

On affiche le formulaire, mais il ne se passe rien quand on clique. Retournons dans app.py.

La méthode validate_on_submit()

C'est la méthode magique de Flask-WTF. Elle renvoie True SI ET SEULEMENT SI :

  1. La requête est un POST.
  2. Le token CSRF est valide.
  3. Toutes les données respectent tes validateurs (Email, Length, etc.).
from flask import flash, redirect, url_for

@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    
    if form.validate_on_submit():
        # Ici, tout est bon !
        email_entré = form.email.data
        password_entré = form.password.data
        
        # (Plus tard on vérifiera dans la base de données)
        
        # Feedback utilisateur
        flash(f'Connexion réussie pour {email_entré} !', 'success')
        return redirect(url_for('dashboard'))
    
    # Si on est ici, c'est soit un GET (premier affichage),
    # soit la validation a échoué (les erreurs sont dans l'objet form)
    return render_template('login.html', form=form)

Les "Flash Messages" (flash)

flash() permet de stocker un message temporaire qui s'affichera à la prochaine page chargée, puis disparaîtra. C'est parfait pour les notifications "Succès", "Erreur", etc.

Pour les afficher, il faut modifier ton template de base (base.html), juste au-dessus du contenu :

<!-- Dans base.html -->
<div class="container">
    {% with messages = get_flashed_messages(with_categories=true) %}
        {% if messages %}
            {% for category, message in messages %}
                <div class="alert alert-{{ category }}">
                    {{ message }}
                </div>
            {% endfor %}
        {% endif %}
    {% endwith %}

    {% block content %}{% endblock %}
</div>

Ainsi, quand tu fais flash('Bravo', 'success'), ça génère une div avec la classe alert-success.