Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
python:flask:login [2021/10/20 04:54] marclebrun [Affichage du formulaire] |
python:flask:login [2021/10/20 06:11] (Version actuelle) |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Login ====== | ====== Login ====== | ||
- | Système de login simple sans utiliser le paquet **Flask-Login** (pour l'instant :-) ) | + | Système de login simple sans utiliser de plugins |
+ | tels que **Flask-Login** ou **Flask-User** | ||
+ | (pour l'instant :-) ) | ||
===== Formulaire ===== | ===== Formulaire ===== | ||
Ligne 34: | Ligne 36: | ||
<code python> | <code python> | ||
- | from flask import request, session, redirect, flash | + | from flask import request, session, redirect, flash, render_template, url_for |
- | from flask import render_template, url_for | + | from werkzeug.security import check_password_hash |
- | from werkzeug.security import generate_password_hash, check_password_hash | + | |
</code> | </code> | ||
Ligne 52: | Ligne 53: | ||
On utilise **check_password_hash** pour comparer le mot de passe entré. | 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"]**. | ||
<code python> | <code python> | ||
Ligne 84: | Ligne 87: | ||
</code> | </code> | ||
+ | ===== Déconnexion ===== | ||
+ | |||
+ | On supprime simplement la valeur **session["login"]**, puis on redirige vers | ||
+ | la page d'accueil. | ||
+ | |||
+ | <code python> | ||
+ | @app.route("/logout") | ||
+ | def logout(): | ||
+ | session.pop("login", None) | ||
+ | return redirect(url_for('home')) | ||
+ | </code> | ||
+ | |||
+ | ===== 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**. | ||
+ | |||
+ | <code python> | ||
+ | @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"]) | ||
+ | </code> | ||
+ | |||
+ | ===== Templates ===== | ||
+ | |||
+ | Afficher soit le lien **login** si on n'est pas connecté, soit le lien **logout** | ||
+ | si une session est en cours. | ||
+ | |||
+ | <code twig> | ||
+ | {% if session.login %} | ||
+ | <a href="{{ url_for('logout') }}">Déconnexion</a> | ||
+ | {% else %} | ||
+ | <a href="{{ url_for('login') }}">Connexion</a> | ||
+ | {% endif %} | ||
+ | </code> | ||
+ | |||
+ | Le reste est accessible dans la variable **g**. | ||
+ | Par exemple : | ||
+ | |||
+ | <code twig> | ||
+ | {% if g.current_user %} | ||
+ | <p>Vous êtes connecté(e) en tant que {{ g.current_user.full_name }}.</p> | ||
+ | {% endif %} | ||
+ | </code> | ||
+ | |||
+ | ===== Hashage d'un mot de passe ===== | ||
+ | |||
+ | <code python> | ||
+ | from werkzeug.security import generate_password_hash | ||
+ | |||
+ | password_hash = generate_password_hash('mon_mot_de_passe') | ||
+ | </code> | ||