У меня есть веб-приложение, созданное с помощью python / flask, и я использую flask-login для аутентификации пользователей. В пользовательском интерфейсе пользователь может выйти из системы. Но пользователь также может выйти из системы с помощью базы данных (по истечении сеанса или по истечении срока действия пользователя).
Мой пользовательский загрузчик выглядит так:
@login_manager.user_loader
def user_loader(id):
user = SessionUser.find_by_session_id(id) #hits the database
if user is None:
flash('You have been automatically logged out')
#flask_login.logout_user() #RecursionError: maximum recursion depth exceeded
session['user_id'] = None
return user
Когда база данных не может найти id
, я хочу, чтобы пользователь вышел из системы. Причины: нет необходимости нажимать SessionUser.find_by_session_id
-call более одного раза, если id
не может быть найден. Кроме того, я хочу показать сообщение, что пользователь вышел из системы (и я хочу показать это только один раз). Наконец, когда пользователь выходит из базы данных, я хочу использовать неаутентифицированные шаблоны.
Если у меня нет кода if user is None:
, пользовательский загрузчик попадал в него при каждом запросе. С этим есть две проблемы:
- Я не могу высветить сообщение "Вы были автоматически отключены" (потому что оно будет продолжать отображаться)
- Произошло ненужное попадание в базу данных.
Я исправил это, очистив переменную сеанса user_id
, но это нежелательное решение, поскольку оно использует внутренние компоненты flask_login
, а не API.
Какой будет лучший подход?