django重複コミット防止

2498 ワード

原理:機能を装飾器に書き、コードの侵入性を減らす.主に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