• flask自定义组件


    在使用flask-session,flask-sqlalchemy等组件时,我们发现都是导入以后实例化一个类,并将app传入进行使用,或者先实例化一个对象,再利用对象的init_app方法将app传入使用

    复制代码
    from flask import request,session,redirect
    
    class Auth(object):
    
        def __init__(self,app=None):
            self.app = app
            if app:
                self.init_app(app)
    
        def init_app(self,app):
            app.auth_manager = self
    
            self.app = app
            app.before_request(self.check_login)
            app.context_processor(self.context_processor)
    
        def check_login(self):
            """
            检查用户是否已经登录
            :return:
            """
            if request.path == '/login':
                return
    
            user = session.get('user')
            if not user:
                return redirect('/login')
    
        def context_processor(self):
            user = session.get('user')
            return dict(current_user=user)
    
        def login(self,data):
            """
            将用户登录信息,放入session
            :param data:
            :return:
            """
            session['user'] = data
    
        def logout(self):
            """
            将用户登录信息,放入session
            :param data:
            :return:
            """
            del session['user']
    复制代码

    这里要注意app.context_processor方法可以定义一些全局的变量,在所有的视图中都可以渲染使用

    同时为了在视图中能使用这个类中的函数,我们在init_app方法中定义了app.auth_manager = self,这样在视图中我们就可以通过导入current_app.auth_manager来得到这个类的对象,从而调用类中的方法了

    视图中应用

    复制代码
    from flask import blueprints,render_template,request,session,redirect,current_app
    from s8day130_pro import models
    from s8day130_pro import db
    ac = blueprints.Blueprint('ac',__name__)
    
    @ac.route('/login',methods=['GET','POST'])
    def login():
    
        if request.method == 'GET':
            return render_template('login.html')
        else:
            user = request.form.get('user')
            pwd = request.form.get('pwd')
    
            obj = db.session.query(models.Users).filter(models.Users.name==user,models.Users.pwd==pwd).first()
            db.session.remove()
            if not obj:
                return render_template('login.html',msg='用户名或密码错误')
    
            current_app.auth_manager.login(user)
            return redirect('/index')
    
    
    @ac.route('/logout')
    def logout():
        current_app.auth_manager.logout()
        return redirect('/login')
    复制代码

    __init__.py中使用自定义组件

    复制代码
    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    from exts.auth import Auth
    
    # 包含了SQLAlchemy相关的所有操作
    db = SQLAlchemy()
    
    from .views.account import ac
    from .views.home import hm
    
    def create_app():
        app = Flask(__name__)
        app.config.from_object('settings.DevelopmentConfig')
    
        app.register_blueprint(ac)
        app.register_blueprint(hm)
    
        db.init_app(app)
        Auth(app)
    
        return app
    复制代码

    我们也可以模仿这些组件的做法自定义一个认证组件

    首先创建组件的目录和文件

    auth.py

  • 相关阅读:
    Centos7部署jenkins
    查看杀死django进程
    【填坑】python3 manage.py migrate:?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
    Amazon S3 加密
    向 Elastic Beanstalk 环境中添加数据库
    Amazon RDS 监控概览
    AWS Lambda 环境变量
    使用 DynamoDB Auto Scaling 自动管理吞吐容量
    使用 Amazon Aurora Auto Scaling 扩展 Aurora 副本
    ECS 服务 Auto Scaling 和 Application Auto Scaling
  • 原文地址:https://www.cnblogs.com/xyhh/p/10860418.html
Copyright © 2020-2023  润新知