Метод request_loader
Метод request_loader применяется к объекту
LoginManager и регистрирует функцию-загрузчик
пользователя из запроса. В отличие от user_loader,
который работает с сессией, данный метод получает
сам объект request. Это удобно для аутентификации
по токену в заголовке или по API-ключу в параметрах.
Функция должна вернуть объект пользователя либо
None, если пользователь не найден.
Синтаксис
@login_manager.request_loader
def load_user_from_request(request):
# return user or None
Пример
Давайте загрузим пользователя из заголовка
Authorization. Создадим приложение Flask
и зарегистрируем загрузчик:
from flask import Flask, request
from flask_login import LoginManager, UserMixin
app = Flask(__name__)
app.secret_key = 'secret'
login_manager = LoginManager()
login_manager.init_app(app)
class User(UserMixin):
def __init__(self, id):
self.id = id
@login_manager.request_loader
def load_user_from_request(request):
token = request.headers.get('Authorization')
if token == 'abcde':
return User('1')
return None
Теперь при запросе с заголовком
Authorization: abcde пользователь будет
считаться аутентифицированным.
Пример
Давайте проверим загрузчик в обработчике маршрута:
from flask import Flask, request
from flask_login import LoginManager, UserMixin, current_user
app = Flask(__name__)
app.secret_key = 'secret'
login_manager = LoginManager()
login_manager.init_app(app)
class User(UserMixin):
def __init__(self, id):
self.id = id
@login_manager.request_loader
def load_user_from_request(request):
token = request.headers.get('Authorization')
if token == 'abcde':
return User('1')
return None
@app.route('/')
def index():
if current_user.is_authenticated:
return 'hello ' + current_user.id
return 'hello guest'
Результат выполнения кода для запроса с заголовком
Authorization: abcde:
hello 1
Пример
Давайте загрузим пользователя из параметра запроса
token:
from flask import Flask, request
from flask_login import LoginManager, UserMixin
app = Flask(__name__)
app.secret_key = 'secret'
login_manager = LoginManager()
login_manager.init_app(app)
class User(UserMixin):
def __init__(self, id):
self.id = id
@login_manager.request_loader
def load_user_from_request(request):
token = request.args.get('token')
if token == 'abcde':
return User('user')
return None
Смотрите также
-
метод
user_loader,
который загружает пользователя из сессии -
класс
LoginManager,
который управляет аутентификацией -
функция
login_user,
которая выполняет вход пользователя -
метод
init_app,
который привязывает LoginManager к приложению