最近在学习Flask,使用flask-login时,一直无法完成保持登录的状态,网上的例子都是使用SQLAlchemy,但是我用的是mongodb。
网上的例子使用SQLAlchemy时,定义User类时是这么写的:
class User(UserMixin,db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64), unique=True, index=True) role_id = db.Column(db.Integer, db.ForeignKey('roles.id')) def __repr__(self): return '<User %r>' % self.username
然后在登陆时用如下语句进行匹配查询:
user = User.query.filter_by(username=form.name.data).first()
我设置了下断点,发现这个语句返回的是这样的:
从图上能看出来这个语句将整个User类返回了
而我的定义是这样的:
class User():
def __init__(self, username, email, password):
self.username = username
self.email = email
self.password_hash = self.set_password(password)
self.db = MongoClient().blog.User
def new_user(self):
collection = {
'name': self.username,
'email': self.email,
'password': self.password_hash
}
self.db.insert(collection)
@property
def password(self, password):
raise AttributeError('password is not a readable attribute')
def set_password(self, password):
return generate_password_hash(password)
查找匹配语句:
user = MongoClient().blog.User.find_one({'email': form.email.data})
返回的是一个json格式文档:
那么flask-login是怎么实现在不同页面保持登录的呢?
Hello,{% if current_user.is_authenticated %}
{{ current_user.name }}
flask-login是通过load_user将一个帐号导入,然后再通过is_active和is_anonymous等验证显示。
我们必须在mongodb返回的信息中添加这几个bool值,才能完成验证操作。
我的解决方案是另建一个新类,从mongodb查找并导出信息,然后重新创建一个新的类,然后将新创建的类传给load_user。
class temp(UserMixin): is_active = True is_anonymous = False is_authenticated = True def __init__(self, id, username, email, password): self.id = str(id) self.name = username self.email = email self.password_hash = password def get_id(self): return self.id def __repr__(self): return self.username
@login_manager.user_loader def load_user(user_id): user = MongoClient().blog.User.find_one({'_id': ObjectId(user_id)}) return temp(id=user.get('_id'), username=user.get('name'), email=user.get('email'), password=user.get('password'))