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

问题描述 投票:0回答:4

我正在尝试从烧瓶登录中使用当前用户。所以我尝试使用

g
对象

我将

flask.ext.login.current_user
分配给
g
对象

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

如果用户正确,它就会起作用。但是当我使用错误的凭据注册或登录时,我收到此错误:

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

请告诉我我哪里错了......

python flask flask-login
4个回答
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

如果是匿名请求,它就能够获取用户名。


12
投票

嗯,错误消息说明了一切。没有登录用户,因此

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
不会引用真实用户的可能性。


6
投票

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


0
投票

为了查找是否存在登录会话,我们可以执行以下操作:(我已经浏览了所有解决方案,并注意到当我使用以下语句时它失败了。)

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

正确的做法是:

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

然后就可以正常工作了。

© www.soinside.com 2019 - 2024. All rights reserved.