From 71e91efe29fab747f161ccfdc0f1b153929b5241 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 19 Mar 2026 21:55:09 +0800 Subject: [PATCH] fix: stabilize idempotent decorator cache key --- apps/utils/decorators.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/apps/utils/decorators.py b/apps/utils/decorators.py index 4a01ab13..fb2e01cb 100644 --- a/apps/utils/decorators.py +++ b/apps/utils/decorators.py @@ -2,6 +2,7 @@ import logging from functools import wraps from apps.utils.tasks import send_mail_task import traceback +import hashlib import json from django.core.cache import cache from rest_framework.exceptions import ParseError @@ -30,18 +31,23 @@ def idempotent(seconds=4): def decorate(func): @wraps(func) def wrapper(*args, **kwargs): - rdata = args[1].data - rdata['request_userid'] = getattr(args[1], 'user').id - rdata['request_path'] = getattr(args[1], 'path') - hash_k = hash(json.dumps(rdata)) + request = args[1] + rdata = dict(request.data) + rdata['request_userid'] = getattr(request, 'user').id + rdata['request_path'] = getattr(request, 'path') + payload = json.dumps(rdata, sort_keys=True, ensure_ascii=False, default=str) + hash_k = hashlib.sha256(payload.encode('utf-8')).hexdigest() hash_v_e = cache.get(hash_k, None) if hash_v_e is None: cache.set(hash_k, 'o', seconds) real_func = func(*args, **kwargs) - # real_func.render() - # cache.set(hash_k, real_func, seconds) + if hasattr(real_func, 'data'): + cache.set(hash_k, real_func.data, seconds) + else: + cache.delete(hash_k) return real_func elif hash_v_e == 'o': # 说明请求正在处理 raise ParseError(f'请求忽略,请{seconds}秒后重试') + return hash_v_e return wrapper - return decorate \ No newline at end of file + return decorate