最近在學習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'))
