2013-10-23 24 views
10

我整个烧瓶兆教程现在的工作,我已经碰到这段代码:Flask-Login中使用的“is_authenticated”方法有什么意义?

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让我使用这些看似无用的方法吗?

回答

27

首先,is_anonymous()is_authenticated()是彼此相反的。如果你愿意,你可以将其中一个定义为另一个的否定。

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

没人登陆时在烧瓶登录的current_user被设置为AnonymousUser对象。该物体对is_authenticated()is_active()Falseis_anonymous()True作出响应。

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

+0

谢谢米格尔,这很有道理。我没有意识到current_user可以返回一个AnonymousUser或一个User对象。期待在书出来的时候拿到书。 – user1787531

+0

这不会影响答案,但在当前版本的Flask-Login中,这三个方法现在是属性。 – davidism

4

我被这个is_authenticated vs is_anonymous困惑了几个小时。我无法相信他们正好相反。最后,偶然发现了this old blog post。这是Django模板系统中的一个问题,其中不存在的变量计算结果为False。在模板代码中测试is_anonymous时可能会导致错误的行为。这又是一个古老的问题,所以我不知道它是否成立。他们解决问题的方式是创建is_authenticated

我猜Flask-Login只是从Django中复制模型而不提问。现在我可以安心入睡了。

相关问题