Flask-Login:特定属性的错误

Flask-Login: Errors With Specific Attributes

我正在尝试创建和使用与 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: 'User' object has no attribute 'is_active'

遇到 this answer,我试图通过将函数从 class User(db.Model) 更改为 class User(db.Model, UserMixin) 来解决此问题,尽管我是手动实现这些方法。这样做消除了上述错误,我开始看到:

NotImplementedError: No id attribute - override get_id

我在这里做错了什么?虽然我没有名为 id 的属性,但我已经设置了 get_id 函数(如上所述)。上面的函数没有被提取是否有特殊原因?

尤其是当我将 user = User.query.get(form.username.data) 传递给 login_user() 时会出现错误。

您是如何设置 user_loader 的?您必须像这样向它传递一个用户实例:

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

Example

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

您应该在用户中添加 id 列 class

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()