我尝试创建和使用与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()
时会发生错误。
答案 0 :(得分:2)
你是如何设置user_loader的?您必须将它传递给用户实例,如下所示:
@login_manager.user_loader
def load_user(user_id):
return User.query.filter(User.id == int(user_id)).first()
答案 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()