16

我现在正在学习 Flask Mega-Tutorial,我遇到了这段代码:

class User(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    nickname = db.Column(db.String(64), unique = True)
    email = db.Column(db.String(120), unique = True)
    role = db.Column(db.SmallInteger, default = ROLE_USER)
    posts = db.relationship('Post', backref = 'author', lazy = 'dynamic')

    def is_authenticated(self):
        return True

    def is_active(self):
        return True

    def is_anonymous(self):
        return False

    def get_id(self):
        return unicode(self.id)

    def __repr__(self):
        return '<User %r>' % (self.nickname)

is_authenticated、is_active 和 is_anonymous 对我来说似乎很奇怪——它们什么时候会返回除预定义值之外的任何值?

有人可以向我解释为什么 Flask-Login 让我使用这些看似无用的方法吗?

4

2 回答 2

39

首先,is_anonymous()is_authenticated()互为逆。如果您愿意,您可以将一个定义为另一个的否定。

您可以使用这两种方法来确定用户是否已登录。

当没有人登录时,Flask-Logincurrent_user被设置为一个AnonymousUser对象。此对象响应is_authenticated()and is_active()withFalse和 to is_anonymous()with True

is_active()方法还有另一个重要用途。与其像我在教程中建议的那样总是返回True,您可以让它False为被禁止或停用的用户返回,并且这些用户将不被允许登录。

于 2013-10-23T04:50:11.043 回答
9

is_authenticated我对这个vsis_anonymous几个小时感到困惑。我简直不敢相信他们正好相反。最后偶然发现了这篇旧博文。这是关于 Django 模板系统中的一个问题,其中不存在的变量计算为False. is_anonymous在模板代码中进行测试时,这可能会导致错误行为。又是旧的,所以我不知道它是否成立。他们解决问题的方法是创造is_authenticated.

我猜 Flask-Login 只是毫无疑问地从 Django 复制了模型。现在我可以安心睡觉了。

于 2014-02-19T22:45:30.927 回答