原理:
把功能写成一个装饰器,减少代码侵入性。主要是利用redis的incr原子性,注意设置key过期时间,防止某个异常导致key没删掉,到时候会一直返回重复请求。
def lock_request(func):
@wraps(func)
def wrapper(view_obj,request,*args, **kwargs):
token = request.META.get('HTTP_AUTHORIZATION')
key = '{}:{}:{}'.format(token, view_obj.__class__.__name__, func.__name__)
#print('key is ', key)
redis_conn = get_redis_connection("default")
count = redis_conn.incr(key)
redis_conn.expire(key, 60)
if count > 1:
return Response({'flag': 0, 'msg': '重复请求', 'code': 996})
else:
res = func(view_obj,request,*args, **kwargs)
redis_conn.delete(key)
return res
return wrapper