zoukankan      html  css  js  c++  java
  • flask 对于用户登录保持状态 flask_login

    先加载flask_login 

    ext.py  在app下的__init__.py 进行引用把,我就不写了

    login_manager = LoginManager()
    # 如果没有登录则重定向到该蓝图的视图函数
    login_manager.login_view = "user.login"
    # 对登录用户进行监视,最高等级
    login_manager.session_protection = "strong"
    
    def inin_ext(app):
    
        login_manager.init_app(app)

    然后在数据库用户User模型中除了继承自sqlalhemy之外还继承 flask_login的 UserMixin 

    modles.py

    '''
    模型类需要继承flask_login UserMixin ,不然需要重写四个方法  
    is_active  
    get_id   
              
    is_authenticated    登录用户
    is_anonymous        未登录用户
    只需需要理会这两个方法就行
    '''
    
    class User(db.Model,UserMixin):
        id = db.Column(db.Integer,primary_key=True,autoincrement=True)
        nicheng = db.Column(db.String(20))
        email = db.Column(db.String(20))
        password_hash = db.Column(db.String(200))
    
    
        # 以下都是关于密码加密解密
        @property
        def password(self):
            raise AttributeError('没有权限查看密码!')
    
        @password.setter
        def password(self,password):
            self.password_hash = generate_password_hash(password)
    
        def check_password(self,password):
            return check_password_hash(self.password_hash,password)

    继续在该模型文件中添加  用来获取传递过来的实例

    # flask_login的实例 + user_loader 获取在视图函数views.py中login_user传递过来的参数 得到该实例
    @login_manager.user_loader
    def load_user(id):
        return User.query.get(int(id))

    views.py

    @user.route('/login/',methods=['GET','POST'])
    def login():
        form = loginForm()
        if form.validate_on_submit():
            email = form.email.data
            password = form.password.data
    
            # 每一偶在表单中验证密码了,直接在这里验证是否为True
            user = User.query.filter_by(email=email).first()
            if user is not None and user.check_password(password):
    
                # 传入该登录用户的User对象,在modles.py中回调函数会对传入的对象 存入session
                login_user(user,remember=True)
                return redirect(url_for('user.index'))
            return redirect(url_for('user.login'))
    
        form.password.data = ''
        return render_template('login.html',form=form)
    
    
    # 用户退出
    @user.route('/logout')
    def logout():
        logout_user()
        return redirect(url_for("user.index"))

    其实只需要记住 在模型中继承flask_login UserMixin   并在模型外添加一个获取用户实例的函数 

    @login_manager.user_loader
    def load_user(id):
        return User.query.get(int(id))

    在进行登录时 将登录用户在数据库中查询得到的实例传递过去

    login_user(user,remember=True)    # user 是登录用户实例

    退出登录则使用

    logout_user()

    保护识图不被未登录用户访问

    在每个识图装饰器下添加

    @蓝图.route('/xxxx/')
    @login_required
    def xxxx():
        xxxx
        retrue 'xxxx'
    login_manager.login_view = "user.login"
    
    # 该配置会将未登录用户重定向到该识图函数中



    其中flask 自带一个 current_app 作为代理对不能导入app实例 进行一个替代 (导入死循环)

    flask_login 也带有一个 current_user 可以对当前登录用户进行一个操作,比如数据库模型有id name ,可以对其操作 current_user.name  得到该实例的数据

    特别是在jijia2 模板中操作

                    {% if not current_user.is_authenticated %}
                        <li><a href="{{ url_for("user.login") }}">登录</a></li>
                        <li><a href="{{ url_for("user.register") }}">注册</a></li>
                    {% endif %}
    
                    {% if current_user.is_authenticated %}
                        <li><a href="{{ url_for("user.index") }}">{{ current_user.nicheng }}</a></li>
                        <li><a href="{{ url_for('user.logout') }}">退出</a></li>
                    {% endif %}

    通过  current_user.is_authenticated 对用户登录状态进行一个确定是否为登录用户  current_user.nicheng 显示出该实例用户的昵称




    在登录视图函数中添加session的过期时间,不能再配置文件中填写,要在登录时进行书写 

    login_user(user)
    # 设置session过期时间 过期时间一天
    session.permanent = True 
    app
    = current_app._get_current_object()
    app.permanent_session_lifetime
    = timedelta(days=1)

    详细请看  https://www.cnblogs.com/practice-h/p/8883487.html

  • 相关阅读:
    RabbitMQ的应用场景以及基本原理介绍
    spring 读取配置文件,将值注入到静态字段
    单元测试不依赖于容器,任何依赖容器的测试在单元测试中都行不通(切记,切记)
    在 KVM 上安装 Win7 虚拟机
    识别 Linux上的设备(磁盘)类型
    云与备份之(1):VMware虚机备份和恢复
    理解 OpenStack + Ceph (9): Ceph 的size/min_size/choose/chooseleaf/scrubbing/repair 等概念
    OpenStack 企业私有云的若干需求(10):OpenStack 的前景和钱景
    OpenStack 企业私有云的若干需求(9): 云管理平台 CMP
    理解 OpenStack + Ceph (8): 基本的 Ceph 性能测试工具和方法
  • 原文地址:https://www.cnblogs.com/zengxm/p/11186410.html
Copyright © 2011-2022 走看看