28 lines
856 B
Python
28 lines
856 B
Python
from rest_framework.response import Response
|
||
from rest_framework import status
|
||
from utils.idempotency_helper import generate_idempotency_key, check_idempotency, get_user_identifier
|
||
|
||
|
||
def idempotent(timeout=10):
|
||
"""
|
||
幂等性装饰器,用于单个DRF接口
|
||
:param timeout: 重复判断时间窗口(秒)
|
||
"""
|
||
|
||
def decorator(view_func):
|
||
def wrapper(self, request, *args, **kwargs):
|
||
user_id = get_user_identifier(request)
|
||
key = generate_idempotency_key(user_id, request.path, request.body)
|
||
|
||
if check_idempotency(key, timeout):
|
||
return Response(
|
||
{"error": "请勿重复提交"},
|
||
status=status.HTTP_409_CONFLICT
|
||
)
|
||
|
||
return view_func(self, request, *args, **kwargs)
|
||
|
||
return wrapper
|
||
|
||
return decorator
|