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