Outils pour utilisateurs

Outils du site


Panneau latéral

Plan du Site:

python:flask:login

Login

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

Formulaire

<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>

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 %}
    <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 %}

Hashage d'un mot de passe

from werkzeug.security import generate_password_hash
 
password_hash = generate_password_hash('mon_mot_de_passe')
python/flask/login.txt · Dernière modification: 2021/10/20 06:11 (modification externe)