我现在正在使用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让我使用这些看似无用的方法吗?
答案 0 :(得分:29)
首先,is_anonymous()
和is_authenticated()
是彼此相反的。如果你愿意,你可以将一个定义为另一个的否定。
您可以使用这两种方法来确定用户是否已登录。
当没有人登录时,Flask-Login的current_user
被设置为AnonymousUser
个对象。此对象使用is_authenticated()
回复is_active()
和False
,使用is_anonymous()
回复True
。
is_active()
方法有另一个重要用途。不像我在教程中提出的那样总是返回True
,而是可以让它为被禁用或停用的用户返回False
,并且不允许这些用户登录。
答案 1 :(得分:8)
我被这个is_authenticated
vs is_anonymous
困扰了好几个小时。我简直不敢相信他们正好相反。最后我偶然发现了this old blog post。它是关于Django模板系统中的一个问题,其中不存在的变量的计算结果为False
。在模板代码中测试is_anonymous
时,这可能会导致错误的行为。这又是旧的,所以我不知道它是否成立。他们解决问题的方法是创建is_authenticated
。
我猜Flask-Login只是从Django复制模型而没有质疑。现在我可以安然入睡。