django 防重复提交

原理:
把功能写成一个装饰器,减少代码侵入性。主要是利用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

你可能感兴趣的:(django)