Метод user_loader
Метод user_loader применяется к объекту
LoginManager и регистрирует функцию-загрузчик
пользователя. Flask-Login хранит в сессии идентификатор
пользователя и при каждом запросе вызывает эту функцию,
чтобы восстановить объект пользователя. Первым параметром
передаётся функция, принимающая идентификатор пользователя
и возвращающая объект пользователя либо None, если
пользователь не найден.
Синтаксис
@login_manager.user_loader
def load_user(user_id):
pass
Пример
Давайте зарегистрируем загрузчик, который возвращает объект пользователя по его идентификатору:
from flask import Flask
from flask_login import LoginManager, UserMixin
app = Flask(__name__)
app.secret_key = 'abcde'
login_manager = LoginManager()
login_manager.init_app(app)
class User(UserMixin):
def __init__(self, id):
self.id = id
users = {
'1': User('1'),
'2': User('2')
}
@login_manager.user_loader
def load_user(user_id):
return users.get(user_id)
Теперь при каждом запросе Flask-Login будет брать
идентификатор из сессии и передавать его в функцию
load_user, чтобы восстановить объект пользователя.
Пример
Давайте проверим, как загрузчик возвращает пользователя и что происходит, если идентификатор не найден:
from flask import Flask
from flask_login import LoginManager, UserMixin
app = Flask(__name__)
app.secret_key = 'abcde'
login_manager = LoginManager()
login_manager.init_app(app)
class User(UserMixin):
def __init__(self, id):
self.id = id
users = {
'1': User('1'),
'2': User('2')
}
@login_manager.user_loader
def load_user(user_id):
return users.get(user_id)
with app.app_context():
res = load_user('1')
print(res.id)
res = load_user('3')
print(res)
Результат выполнения кода:
"1"
None
Пример
Давайте используем загрузчик вместе с функцией
login_user для входа пользователя и сохранения
его идентификатора в сессии:
from flask import Flask
from flask_login import LoginManager, UserMixin, login_user
app = Flask(__name__)
app.secret_key = 'abcde'
login_manager = LoginManager()
login_manager.init_app(app)
class User(UserMixin):
def __init__(self, id):
self.id = id
users = {
'1': User('1'),
'2': User('2')
}
@login_manager.user_loader
def load_user(user_id):
return users.get(user_id)
@app.route('/login')
def login():
user = users.get('1')
login_user(user)
return 'hello'
После входа пользователя его идентификатор сохраняется в сессии, а загрузчик восстанавливает объект пользователя при следующих запросах.
Смотрите также
-
класс
LoginManager,
который управляет аутентификацией во Flask -
метод
request_loader,
который загружает пользователя из данных запроса -
функцию
login_user,
которая выполняет вход пользователя -
класс
UserMixin,
который добавляет пользователю стандартные методы