Flask中mongodb实现flask_login保持登录

最近在学习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'))

 

转载于:https://www.cnblogs.com/INnoVationv2/p/5765770.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值