Système de login simple sans utiliser de plugins tels que Flask-Login ou Flask-User (pour l'instant )
<form method="POST"> <h1>Veuillez vous identifier</h1> <label for="login">Login</label> <input type="text" name="login" id="login" placeholder="Nom ou adresse email" required autofocus /> <label for="password">Mot de passe</label> <input type="password" id="password" name="password" required /> <button type="submit">Connexion</button> </form>
from flask import request, session, redirect, flash, render_template, url_for from werkzeug.security import check_password_hash
@app.route("/login", methods=['GET']) def login(): return render_template("login.html")
Le mot de passe est stocké sous forme hashée par generate_password_hash.
On utilise check_password_hash pour comparer le mot de passe entré.
En cas de réussite, le nom d'utilisateur est stocké dans session[“login”].
@app.route("/login", methods=['POST']) def login_check(): # Lire les valeurs reçues du formulaire login = request.form.get('login') password = request.form.get('password') success = False # Rechercher l'utilisateur selon son login user = recherche_selon_login(login) # La fonction renvoie le login et la version hashée du mot de passe if user: # On la compare avec la version hashée du password entré if check_password_hash(user['password'], password): # Si cela correspond, on enregistre le login dans la session success = True session["login"] = user['login'] flash(u"Vous êtes connecté", "success") # Si success est resté à False, le login n'est pas trouvé ou le mot de # passe ne correspondait pas. if not success: flash(u"Le mot de passe est incorrect...", "error") return redirect(request.url) return redirect(url_for('home'))
On supprime simplement la valeur session[“login”], puis on redirige vers la page d'accueil.
@app.route("/logout") def logout(): session.pop("login", None) return redirect(url_for('home'))
À chaque requête, l'utilisateur est lu sur base de la valeur de session[“login”] afin de le stocker dans la variable g.
@app.before_request def before_request(): # Rechercher l'utilisateur selon le login sauvé dans la session # La valeur renvoyée peut être un objet ou un dictionnaire contenant # les propriétés de l'utilisateur, ses droits, etc... # Si pas trouvé, la valeur renvoyée est None g.current_user = recherche_selon_login(session["login"])
Afficher soit le lien login si on n'est pas connecté, soit le lien logout si une session est en cours.
{% if session.login %} <a href="{{ url_for('logout') }}">Déconnexion</a> {% else %} <a href="{{ url_for('login') }}">Connexion</a> {% endif %}
Le reste est accessible dans la variable g. Par exemple :
{% if g.current_user %} <p>Vous êtes connecté(e) en tant que {{ g.current_user.full_name }}.</p> {% endif %}
from werkzeug.security import generate_password_hash password_hash = generate_password_hash('mon_mot_de_passe')