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 装饰器。我知道这很简单。谢谢维克多!