zoukankan      html  css  js  c++  java
  • 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'))
  • 相关阅读:
    谈谈C++新标准带来的属性(Attribute)
    金融数据智能峰会 | 数据规模爆炸性增长,企业如何进行精准决策?云原生数据仓库数据化运营实战分享
    核桃编程:前端可观测性建设之路
    AI和大数据结合,智能运维平台助力流利说提升核心竞争力
    Python静态类型解析工具简介和实践
    盛京剑客系列24:极简估值教程——题记
    Echarts——关系图(人民的名义为例,简化)源码
    UVA10020(最小区间覆盖)
    LA4636积木艺术
    LA4636积木艺术
  • 原文地址:https://www.cnblogs.com/INnoVationv2/p/5765770.html
Copyright © 2011-2022 走看看