===== 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')