23

我正在尝试从烧瓶登录中使用当前用户。所以我试着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'

请指教我哪里错了...

4

3 回答 3

20

感谢您的回答@Joe 和@pjnola,正如你们所建议的那样,我提到了flask-login 文档

我发现我们可以自定义匿名用户类,所以我根据我的要求进行了自定义,

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

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

于 2013-10-09T14:41:34.373 回答
11

好吧,错误消息说明了一切。没有登录用户,所以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不涉及真实用户的可能性。

于 2013-10-09T14:25:36.397 回答
5

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

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

如果您想获得用户名,您也需要

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

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

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

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

于 2013-10-09T14:15:19.050 回答