Ceci est une ancienne révision du document !
pip install flask-login
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()
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))
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.'
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')
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 %}