Как отслеживать текущего пользователя в флэше?

Я пытаюсь использовать текущего пользователя в своем представлении из флэша-входа. Поэтому я попытался g object

Я назначаю flask.ext.login.current_user в объект g

@pot.before_request
 def load_users():
   g.user = current_user.username

Он работает, если пользователь прав. Но когда я делаю подписка или логин, как с неправильными учетными данными Я получаю эту ошибку

AttributeError: 'AnonymousUserMixin' object has no attribute 'username'

Пожалуйста, просветите меня, где я ошибаюсь...

Ответы

Ответ 1

Спасибо за ваш ответ @Joe и @pjnola, как вы все предположили, я назвал документы с флэшками для входа в систему

Я обнаружил, что мы можем настроить анонимный пользовательский класс, поэтому я настроил для своего требования

Anonymous class

#!/usr/bin/python
#flask-login anonymous user class
from flask.ext.login import AnonymousUserMixin
class Anonymous(AnonymousUserMixin):
  def __init__(self):
    self.username = 'Guest'

Затем добавили этот класс в anonymous_user

login_manager.anonymous_user = Anonymous

Из этого он смог получить имя пользователя, если это был анонимный запрос.

Ответ 2

Ну, в сообщении об ошибке говорится все. Пользователь не зарегистрирован, поэтому current_user возвращает AnonymousUserMixin. AnonymousUserMixin реализует описанный здесь интерфейс: http://flask-login.readthedocs.org/en/latest/#your-user-class (который не включает свойство username). Попробуйте что-то вроде этого:

@pot.before_request
def load_users():
    if current_user.is_authenticated():
        g.user = current_user.get_id() # return username in get_id()
    else:
        g.user = None # or 'some fake value', whatever

Очевидно, что остальная часть вашего кода должна иметь дело с тем, что g.user не будет ссылаться на реального пользователя.

Ответ 3

AnonymousUserMixin не имеет атрибута имени пользователя. Вам необходимо перезаписать объект и вызвать mixin. Посмотрите на LoginManager.anonymous_user, который является объектом, который используется, когда пользователь не зарегистрирован.

Вам также нужно получить пользователя откуда-то. Нет смысла хранить имя пользователя в g, поскольку вы могли бы просто использовать current_user.username.

Если вы хотите получить имя пользователя, вам также понадобится

if current_user.is_authenticated():
    g.user = current_user.username

Это потребует, чтобы пользовательский объект имел свойство, называемое именем пользователя. Существует множество способов настройки использования флажков-логинов.

Я предлагаю перечитать документы и взглянуть на исходный код:

https://github.com/maxcountryman/flask-login/blob/master/flask_login.py

Джо