Flask Login: User.is_anonymous() 是一个函数,但是 current_user.is_anonymous 是一个属性。为什么?
Flask Login: User.is_anonymous() is a function, but current_user.is_anonymous is an attribute. Why?
第一次使用flask-login,需要支持匿名用户。经过身份验证的用户将拥有特殊权限。我的用户模型实现了它自己版本的 UserMixin 函数;相关部分是:
def is_authenticated(self):
"""Return True if the user is authenticated."""
return self.authenticated
def is_anonymous(self):
"""If you're not authenticated, you're anonymous."""
return not self.authenticated
有些模板会有如下代码:
{% if current_user is not defined or current_user.is_anonymous %}
...render HTML 1
{% else %}
...render HTML 2
{% endif %}
这对匿名用户来说效果很好,但经过身份验证的用户也会看到 HTML 1,因为 current_user.is_anonymous
的计算结果为 <bound method User.is_anonymous of <User *email-address*>
。同时,如果我将条件更改为 current_user.is_anonymous()
,这将为匿名用户抛出错误(“TypeError:'bool' 对象不可调用”)。我的理解是User Model需要is_anonymous
是一个函数,但是它是current_user
的布尔属性。这种不一致有点令人恼火,但我觉得我遗漏了一些明显的东西。
正确检查用户是否匿名的最佳方法是什么?
编辑:这是我的 user_loader
:
@login_manager.user_loader
def load_user(user_id):
if user_id is not None:
return User.query.filter_by(email=user_id).first()
return None
编辑 2:我删除了我的自定义上下文处理器,因为我了解到 LoginManager
为我提供了一个。尽管如此,问题仍然存在。在我的模板中,current_user.is_anonymous
仍然计算为 <bound function...
。
Victor是正确的;我缺少 @property
装饰器。我知道这很简单。谢谢维克多!
第一次使用flask-login,需要支持匿名用户。经过身份验证的用户将拥有特殊权限。我的用户模型实现了它自己版本的 UserMixin 函数;相关部分是:
def is_authenticated(self):
"""Return True if the user is authenticated."""
return self.authenticated
def is_anonymous(self):
"""If you're not authenticated, you're anonymous."""
return not self.authenticated
有些模板会有如下代码:
{% if current_user is not defined or current_user.is_anonymous %}
...render HTML 1
{% else %}
...render HTML 2
{% endif %}
这对匿名用户来说效果很好,但经过身份验证的用户也会看到 HTML 1,因为 current_user.is_anonymous
的计算结果为 <bound method User.is_anonymous of <User *email-address*>
。同时,如果我将条件更改为 current_user.is_anonymous()
,这将为匿名用户抛出错误(“TypeError:'bool' 对象不可调用”)。我的理解是User Model需要is_anonymous
是一个函数,但是它是current_user
的布尔属性。这种不一致有点令人恼火,但我觉得我遗漏了一些明显的东西。
正确检查用户是否匿名的最佳方法是什么?
编辑:这是我的 user_loader
:
@login_manager.user_loader
def load_user(user_id):
if user_id is not None:
return User.query.filter_by(email=user_id).first()
return None
编辑 2:我删除了我的自定义上下文处理器,因为我了解到 LoginManager
为我提供了一个。尽管如此,问题仍然存在。在我的模板中,current_user.is_anonymous
仍然计算为 <bound function...
。
Victor是正确的;我缺少 @property
装饰器。我知道这很简单。谢谢维克多!