Flask-Login:具有特定属性的错误

时间:2015-03-22 20:44:30

标签: python flask flask-sqlalchemy flask-login

我尝试创建和使用与Flask-Login一起使用的用户功能,如下所示:

class User(db.Model):
    username = db.Column(db.String(80), primary_key=True)
    passhash = db.Column(db.String(160))
    posts = db.relationship('Idea', backref='user')

    def __init__(self, username, password):
        self.username = username
        self.passhash = generate_password_hash(password)

    def __str__(self):
        return "User: " + self.username + " Hash: " + self.passhash

    # Managing passwords using Werkzeug security library
    def check_password(self, password):
        return check_password_hash(self.passhash, password)

    # Necessary functions for Flask-Login session management
    def is_authenticated(self):
        return True

    def is_active(self):
        return True

    def is_anonymous(self):
        # Anonymous users aren't supported
        return False

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

但是,在尝试使用此代码时,我看到错误:

  

AttributeError:'用户'对象没有属性' is_active'

来到this answer,我尝试通过将功能从class User(db.Model)更改为class User(db.Model, UserMixin)来解决此问题,即使我手动实施这些方法也是如此。虽然这样做消除了上述错误,但我开始看到:

  

NotImplementedError:没有id属性 - 覆盖get_id

我在这里做错了什么?虽然我没有名为id的属性,但我已设置get_id功能(如上所述)。是否有一个特殊原因导致上述函数没有被选中?

当我将user = User.query.get(form.username.data)传递给login_user()时会发生错误。

3 个答案:

答案 0 :(得分:2)

你是如何设置user_loader的?您必须将它传递给用户实例,如下所示:

@login_manager.user_loader
def load_user(user_id):
    return User.query.filter(User.id == int(user_id)).first()

Example

答案 1 :(得分:1)

为了将来参考,代码的实现没有问题。事实证明,我的文本编辑器在某些地方混淆了缩进和空格,导致了奇怪的错误。

答案 2 :(得分:1)

您应该在User class

中添加id列

id = db.Column(db.Integer, primary_key = True)

然后设置user_loader

@login_manager.user_loader
def load_user(id):
    return User.query.filter(User.id==int(id)).first()