====== Login ====== Système de login simple sans utiliser de plugins tels que **Flask-Login** ou **Flask-User** (pour l'instant :-) ) ===== Formulaire =====

Veuillez vous identifier

===== Imports ===== from flask import request, session, redirect, flash, render_template, url_for from werkzeug.security import check_password_hash ===== Affichage du formulaire ===== @app.route("/login", methods=['GET']) def login(): return render_template("login.html") ===== Vérification du formulaire ===== 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')) ===== Déconnexion ===== 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')) ===== Lecture de l'utilisateur en cours ===== À 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"]) ===== Templates ===== Afficher soit le lien **login** si on n'est pas connecté, soit le lien **logout** si une session est en cours. {% if session.login %} Déconnexion {% else %} Connexion {% endif %} Le reste est accessible dans la variable **g**. Par exemple : {% if g.current_user %}

Vous êtes connecté(e) en tant que {{ g.current_user.full_name }}.

{% endif %}
===== Hashage d'un mot de passe ===== from werkzeug.security import generate_password_hash password_hash = generate_password_hash('mon_mot_de_passe')