Outils pour utilisateurs

Outils du site


Panneau latéral

Plan du Site:

python:flask:flask_login

Ceci est une ancienne révision du document !


Flask-Login

Installation

pip install flask-login

Classe User

La classe User de l'application doit implémenter quelques propriétés et méthodes, pour cela le plus simple est de la faire hériter de UserMixin :

from flask_login import UserMixin
 
class User(UserMixin, db.Model):
    __tablename__ = 'users'
    id            = db.Column(db.Integer, primary_key = True)
    email         = db.Column(db.String(64), unique=True, index=True)
    username      = db.Column(db.String(64), unique=True, index=True)
    password_hash = db.Column(db.String(128))
    role_id       = db.Column(db.Integer, db.ForeignKey('roles.id'))
    # ...

La classe UserMixin inclut les propriétés et méthodes nécessaires :

  • is_authenticated
  • is_active
  • is_anonymous
  • get_id()

Initialisation

Initialiser le LoginManager lors de la création de l'application :

from flask_login import LoginManager
 
app = Flask(__name__)
 
# ...
 
login_manager = LoginManager()
login_manager.login_view = 'auth.login'
login_manager.init_app(app)
 
# ...

Dans la propriété login_view, on indique la route vers la page de connexion, vers laquelle sera redirigé un utilisateur tentant d'accéder à une page protégée.

Enfin, il faut définir une fonction qui sera appelée lorsque Flask-Login aura besoin de charger un utilisateur sur base de son identifiant.

@login_manager.user_loader
def load_user(user_id):
    # ...
 
    # Lecture de l'utilisateur depuis la base de données
    # L'identifiant est passé sous forme de chaîne, on le
    # transforme en int.
 
    return User.query.get(int(user_id))

Login

 

Protection d'une route

Avec le décorateur @login_required

:!: Il est important de mettre les deux décorateurs dans cet ordre.

from flask_login import login_required
 
@app.route('/secret')
@login_required
def secret():
    return 'Seuls les utilisateurs authentifiés verront ceci.'

Formulaire de login

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitField
from wtforms.validators import DataRequired, Length, Email
 
class LoginForm(FlaskForm):
    email       = StringField('Email',
                  validators=[DataRequired(), Length(1, 64), Email()]
    password    = PasswordField('Password',
                  validators=[DataRequired()])
    remember_me = BooleanField('Keep le logged in')
    submit      = SubmitField('Log In')

Objet current_user

La variable current_user est définie par Flask-Login, et elle disponible dans les templates et dans les vues.

On peut afficher le lien Log In ou Log Out en fonction de l'état de l'utilisateur (connecté ou non) :

{% if current_user.is_authenticated %}
  <a href="{{ url_for('auth.logout') }}">Log Out</a>
{% else %}
  <a href="{{ url_for('auth.login') }}">Log In</a>
{% endif %}
python/flask/flask_login.1666981836.txt.gz · Dernière modification: 2022/10/28 18:30 par marclebrun