• session权限限制


    当flask基于session限制用户访问页面时,有三种实现方式;当然,我们从最low的版本开始:

    from datetime import timedelta
    class Config(object):
        DEBUG = False
        TESTING = False
        SECRET_KEY = "asdfasdfas23"
        DATABASE_URI = 'sqlite://:memory:'
    
        SESSION_COOKIE_NAME = 'session'
        SESSION_COOKIE_DOMAIN = None
        SESSION_COOKIE_PATH = None
        SESSION_COOKIE_HTTPONLY = True
        SESSION_COOKIE_SECURE = False
        SESSION_REFRESH_EACH_REQUEST = True
        PERMANENT_SESSION_LIFETIME = timedelta(hours=1)
    
    
    class ProductionConfig(Config):
        DATABASE_URI = 'mysql://user@localhost/foo'
    
    
    class DevelopmentConfig(Config):
        DEBUG = True
    
    
    class TestingConfig(Config):
        TESTING = True
    settings配置文件
    from flask import Flask,render_template,request,redirect,session,url_for,jsonify,make_response
    
    app = Flask(__name__)
    
    app.config.from_object("settings.DevelopmentConfig")
    
    # app.secret_key = 'xxxxxxxx'
    
    STUDENT_DICT = {
        1:{'name':'王龙泰','age':38,'gender':''},
        2:{'name':'小东北','age':73,'gender':''},
        3:{'name':'田硕','age':84,'gender':''},
    }
    
    @app.route('/login',methods=["GET","POST"])
    def login():
        if request.method == 'GET':
            return render_template('login.html')
        user = request.form.get('user')
        pwd = request.form.get('pwd')
        if user == 'test' and pwd == '666':
            session['user'] = user
            return redirect('/index')
        return render_template('login.html',error='用户名或密码错误')
    
    @app.route('/index')
    def index():
         user = session.get('user')
         if not user:
              return redirect('/login')
        return render_template('index.html',stu_dic=STUDENT_DICT)
    
    @app.route('/delete/<int:nid>')
    def delete(nid):
        user = session.get('user')
        if not user:
            return redirect('/login')
        del STUDENT_DICT[nid]
        return redirect(url_for('index'))
    
    @app.route('/detail/<int:nid>')
    def detail(nid):
        user = session.get('user')
        if not user:
            return redirect('/login')
        info = STUDENT_DICT[nid]
        return render_template('detail.html',info=info)
    
    
    if __name__ == '__main__':
        app.run()    
    View Code

    使用装饰器版本:

    from flask import Flask,render_template,request,redirect,session,url_for,jsonify,make_response
    
    app = Flask(__name__)
    
    app.config.from_object("settings.DevelopmentConfig")
    
    # app.secret_key = 'xxxxxxxx' 已在配置文件中设置,不再在这里进行加盐
    
    def func1(func):
        def inner(*args,**kwargs):
            user = session.get('user')
            if not user:
                return redirect('/login')
            ret = func(*args,**kwargs)
            return ret
        return inner
    
    STUDENT_DICT = {
        1:{'name':'王龙泰','age':38,'gender':''},
        2:{'name':'小东北','age':73,'gender':''},
        3:{'name':'田硕','age':84,'gender':''},
    }
    
    @app.route('/login',methods=["GET","POST"])
    def login():
        if request.method == 'GET':
            return render_template('login.html')
        user = request.form.get('user')
        pwd = request.form.get('pwd')
        if user == 'test' and pwd == '666':
            session['user'] = user
            return redirect('/index')
        return render_template('login.html',error='用户名或密码错误')
    
    @app.route('/index')
    func1
    def index():
        return render_template('index.html',stu_dic=STUDENT_DICT)
    
    @app.route('/delete/<int:nid>')
    @func1
    def delete(nid):
        del STUDENT_DICT[nid]
        return redirect(url_for('index'))
    
    @app.route('/detail/<int:nid>')
    @func1
    def detail(nid):
        info = STUDENT_DICT[nid]
        return render_template('detail.html',info=info)
    
    
    if __name__ == '__main__':
        app.run()
    View Code

    此时运行程序会出现如下错误:

    AssertionError: View function mapping is overwriting an existing endpoint function: inner

    出现此错误是因为视图index、delete、detail都使用了装饰器,此时这三个视图函数都指向inner函数,导致此报错。

    解决方法如下:

    import functools
    
    def func1(func):
        @functools.wraps(func)
        def inner(*args,**kwargs):
            user = session.get('user')
            if not user:
                return redirect('/login')
            ret = func(*args,**kwargs)
            return ret
        return inner

    版本3:

    @app.before_request
    def xzxx():
        if request.path == '/login':
            return None
        if session.get('user'):
            return None
        return redirect('/login')

     补充:关于多个函数使用装饰器时指向inner函数示例:

    def auth(func):
        def inner(*args,**kwargs):
            ret = func(*args,**kwargs)
            return ret
        return inner
    
    @auth
    def index():
        print('index')
    
    @auth
    def detail():
        print('detail')
    
    print(index.__name__)
    print(detail.__name__)
    __name__都指向inner

    import functools
    
    def auth(func):
        @functools.wraps(func)
        def inner(*args,**kwargs):
            ret = func(*args,**kwargs)
            return ret
        return inner
    
    @auth
    def index():
        print('index')
    
    @auth
    def detail():
        print('detail')
    
    print(index.__name__)
    print(detail.__name__)
    __name__指向各自的函数名

  • 相关阅读:
    scikit-learn与数据预处理
    TensorFlow2.0(11):tf.keras建模三部曲
    机器学习回顾篇(11):支持向量机(SVM)
    机器学习回顾篇(10):感知机模型
    TensorFlow2.0(10):加载自定义图片数据集到Dataset
    机器学习回顾篇(9):K-means聚类算法
    FRP代理及其在数据库安全上的实践
    Elasticsearch系列---实战零停机重建索引
    Elasticsearch系列---索引管理
    Elasticsearch系列---搜索执行过程及scroll游标查询
  • 原文地址:https://www.cnblogs.com/shi-guang/p/9174974.html
Copyright © 2020-2023  润新知