Python 装饰器
基本概念
装饰器是一种强大的工具,允许你在不修改原有函数或方法代码的情况下,给其增加额外的功能。装饰器本质上是一个函数,它接受一个函数作为参数并返回一个新的函数。
基本语法
def my_decorator(func):
def wrapper(*args,**kwargs):
print('函数运行之前')
result = func(*args,**kwargs)
print('函数运行之后')
return result
return wrapper
@my_decorator
def my_function():
print('函数运行中')
if __name__ == '__main__':
my_function()
# 带参数的装饰器
def repeat(num_times):
def decorator_repeat(func):
def wrapper_repeat(*args,**kwargs):
for _ in range(num_times):
result = func(*args,**kwargs)
return result
return wrapper_repeat
return decorator_repeat
@repeat(num_times=3)
def say_hello(name):
print(f'hello {name}')
if __name__ == '__main__':
say_hello('lucky')
check_token
# 检查token的装饰器
def check_token(func):
def wrapper(self, *args, **kwargs):
# 接收参数token
token = request.headers.get('token', None)
if not token or token == 'null':
return make_response('token is null', 400)
# 解码操作
try:
token_instance = Token()
user = token_instance.decode(token)
# 取出用户信息
email = user['data']['email']
# 查询
# _sql = "select * from user where email='{}'".format(email)
if r.get(email):
# 刷新token
token = token_instance.refresh_token(token)
# 刷新session
session['token'] = token
# 刷新redis
r.set(email, token, ex=300)
else:
return make_response('token is expired', 400)
except jwt.exceptions.ExpiredSignatureError:
return make_response('token is expired', 400)
except jwt.exceptions.DecodeError:
return make_response('token is error', 400)
# 上下文变量赋值
self.email = email
return func(self, *args, **kwargs)
接收装饰器返回的参数
class ApiImagecode(MethodView):
@check_token
def get(self):
# 使用全局 request 对象
email = self.email
print('接收到的参数:{}'.format(email))
img, code = ImageCode.draw_img()
buf = io.BytesIO()
img.save(buf, 'jpeg')
response = make_response(buf.getvalue())
response.headers['Content-Type'] = 'image/jpeg'
return response