链接
# 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')