Как отследить текущего пользователя в flask-login?
Я пытаюсь использовать текущего пользователя в моем представлении из flask-login. Поэтому я попытался g object
Я назначаю flask.ext.login.current_user
в объект g
@pot.before_request
def load_users():
g.user = current_user.username
он работает, если пользователь прав. Но когда я это делаю ... --9-->зарегистрироваться или войти в систему с неправильными учетными данными Я получаю эту ошибку
AttributeError: 'AnonymousUserMixin' object has no attribute 'username'
пожалуйста, просветите меня, где я ошибаюсь...
3 ответов
Спасибо за ваш ответ @Joe и @pjnola, как вы все предложили я сослался flask-login docs
я обнаружил, что мы можем настроить анонимный класс пользователя, поэтому я настроил для своего требования,
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
из этого он смог получить имя пользователя, если это был анонимный запрос.
Ну, сообщение об ошибке все сказано. Нет зарегистрированного пользователя, поэтому 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
не будет ссылаться на реального пользователя.
AnonymousUserMixin не имеет атрибута имени пользователя. Вам нужно перезаписать объект и вызвать mixin. Взгляните на LoginManager.anonymous_user, который является объектом, который используется, когда пользователь не вошел в систему.
Вам также нужно получить пользователя откуда-то. Нет смысла хранить имя пользователя в g
Как вы могли бы просто использовать функции current_user.имя пользователя:.
Если вы хотите получить имя пользователя, необходимо тоже
if current_user.is_authenticated():
g.user = current_user.username
для этого потребуется, чтобы объект user имеет свойство username. Существует множество способов настройки Flask-Logins use
Я предлагаю перечитать документы и взглянуть на исходный код:
https://github.com/maxcountryman/flask-login/blob/master/flask_login.py
Джо