如何在flask-login中跟踪当前用户?

时间:2013-10-09 13:59:44

标签: python python-2.7 flask flask-login flask-extensions

我试图在flask-login的视图中使用当前用户。所以我试着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'

请让我知道我错在哪里......

3 个答案:

答案 0 :(得分:15)

感谢您的回答@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

从这里可以获取用户名,如果它是匿名请求。

答案 1 :(得分:9)

嗯,错误信息说明了一切。没有登录用户,因此current_user会返回AnonymousUserMixinAnonymousUserMixin实现了此处描述的接口: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不会引用真实用户的可能性。

答案 2 :(得分:5)

AnonymousUserMixin没有用户名属性。您需要覆盖该对象并调用mixin。看一下LoginManager.anonymous_user,这是一个没有用户登录时使用的对象。

您还需要从某个地方获取用户。将用户名存储在g中是没有意义的,因为您可以使用current_user.username。

如果你想获得你需要的用户名

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

这将要求用户对象具有名为username的属性。有很多方法可以自定义Flask-Logins使用

我建议重新阅读文档并查看源代码:

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