装饰器之functools与before_request

链接

# 1. 装饰器
import functools

def auth(func):
    # @functools.wraps(func)  加上这个后print(index.__name__)打印的结果是index, 但本质上执行的还是inner函数,把原函数的源信息封装到闭包函数里了
    # 可避免endpoint反向解析时函数名重名
    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__)     #inner    加上装饰器后本质上执行的是inner函数
print(detail.__name__)    #inner

 学生登陆示例

#版本一:
    @app.route('/index')
    def index():
        if not session.get('user'):
            return redirect(url_for('login'))
        return render_template('index.html',stu_dic=STUDENT_DICT)
#版本二:
    import functools
    def auth(func):
        @functools.wraps(func)
        def inner(*args,**kwargs):
            if not session.get('user'):
                return redirect(url_for('login'))
            ret = func(*args,**kwargs)
            return ret
        return inner

    @app.route('/index')
    @auth
    def index():
        return render_template('index.html',stu_dic=STUDENT_DICT)

    #应用场景:比较少的函数中需要额外添加功能。
    
#版本三:before_request
    @app.before_request
    def xxxxxx():
        if request.path == '/login':
            return None   #继续往下执行

        if session.get('user'):
            return None

        return redirect('/login')

 

posted @ 2020-07-02 10:15  zh_小猿  阅读(144)  评论(0编辑  收藏  举报