1. 装饰器模板
def auth(func):
def inner(*args, **kwargs):
res = func(*args, **kwargs)
return res
return inner
1.1 装饰器的本质
本质实际上就是一种语法糖
例:auth=auth(index)
@app.route('/index', methods=['GET'])
@auth
def index():
return render_template('index.html', users=USERS)
2. flask中装饰器的位置和执行顺序
2.1 简易的登录认证装饰器
def auth(func):
def inner(*args, **kwargs):
if session.get('username'):
res = func(*args, **kwargs)
return res
else:
return redirect('/login')
return inner
2.2 中装饰器的位置
必须放在app.router下
@app.route('/index', methods=['GET'])
@auth
def index():
return render_template('index.html', users=USERS)
如果是在路由下添加了装饰器,在每个app的视图方式下参数一定要添加endpoint参数
@app.route('/index', methods=['GET'],endpoint='detial')
@auth
def index():
return render_template('index.html', users=USERS)
3. 类装饰器
3.1 装饰类的装饰器
效果可能是修改类属性,修改类方法
修改类属性的装饰器
# 定义一个装饰器
def decorater(cls): # 传入一个类即cls,此时的cls就是animal
cls.num_of_animals = 10 # 设置一个类属性
return cls # 返回这个被装饰过的类
# 本质 a = decorater(animal)
@decorater
class animal:
pass
# 这就完成了对类的装饰啦
# 类实例化得到一个对象
A = animal()
# 上面这行代码相当于在运行a = decorater(animal) 运行的结果
# 就是返回了一个被装饰过的新的cls,因此新的cls有了新的属性,就是animal拥有了num_of_animals这一属性
# 我们就能调用这个num_of_animals的属性啦
print(A.num_of_animals)
修改类方法的装饰器
# 定义一个装饰器
def decorater(func):
def wrapper(cls):
cls.num_of_animals = 10
cls.f1 = func
# func就是printd这个方法
# 这里将传入的func即printd作为类的f1函数
return cls
return wrapper
@decorater(printd)
class animal:
pass
def printd(*args):
print('this is a function')
A = animal()
A.f1()
# 是可以调用的哦
# 运行结果:this is a function
3.2 类作为装饰器
类作为装饰器只要将类中定义一个__call__方法,这样在类作为装饰器装饰函数时,函数运行时就会运行__call__方法中的内容,这就完成类作为函数装饰器的作用啦。
# 放个对象
class Person:
def __call__(self, func):
def inner(*args, **kwargs):
res = func(*args, **kwargs)
return res
return inner
p = Person()
# test=p(test)
@p
# p() 会触发__call__--->Person的 __call__(func)--->返回inner,以后test就是inner---》test(参数)--》执行的是inner
def test():
print("test")
print(test)