diff --git a/apps/system/views.py b/apps/system/views.py index ac80f5f5..aa9d6f02 100755 --- a/apps/system/views.py +++ b/apps/system/views.py @@ -609,7 +609,7 @@ class FileViewSet(CustomCreateModelMixin, RetrieveModelMixin, ListModelMixin, Cu serializer_class = FileSerializer filterset_fields = ['type'] search_fields = ['name'] - post_idempotent = False + cache_seconds = 0 def perform_create(self, serializer): file_obj = self.request.data.get('file') diff --git a/apps/utils/viewsets.py b/apps/utils/viewsets.py index 0d216532..af0b24c8 100755 --- a/apps/utils/viewsets.py +++ b/apps/utils/viewsets.py @@ -40,21 +40,33 @@ class CustomGenericViewSet(MyLoggingMixin, GenericViewSet): permission_classes = [IsAuthenticated & RbacPermission] data_filter = False # 数据权限过滤是否开启(需要RbacPermission) data_filter_field = 'belong_dept' - post_idempotent = True - post_idempotent_seconds = 3 + hash_k = None + cache_seconds = 5 # 接口缓存时间默认5秒 + def finalize_response(self, request, response, *args, **kwargs): + if self.hash_k and self.cache_seconds: + cache.set(self.hash_k, response.data, timeout=self.cache_seconds) # 将结果存入缓存,设置超时时间 + return super().finalize_response(request, response, *args, **kwargs) + def initial(self, request, *args, **kwargs): super().initial(request, *args, **kwargs) - if self.post_idempotent and request.method == 'POST': # 如果是post需进行幂等操作 - rdata = request.data - rdata['request_userid'] = request.user.id + cache_seconds = getattr(self, f"{self.action}_cache_seconds", getattr(self, 'cache_seconds', 0)) + if cache_seconds: + self.cache_seconds = cache_seconds + rdata = {} + rdata['request_method'] = request.method rdata['request_path'] = request.path - hash_k = hash(json.dumps(rdata)) - hash_v_e = cache.get(hash_k, None) + rdata['request_data'] = request.data + rdata['request_query'] = request.query_params.dict() + rdata['request_userid'] = request.user.id + self.hash_k = hash(json.dumps(rdata)) + hash_v_e = cache.get(self.hash_k, None) if hash_v_e is None: - cache.set(hash_k, 'o', self.post_idempotent_seconds) + cache.set(self.hash_k, 'o', self.cache_seconds) elif hash_v_e == 'o': # 说明请求正在处理 - raise ParseError(f'请求忽略,请{self.post_idempotent_seconds}秒后重试') + raise ParseError(f'请求忽略,请{self.cache_seconds}秒后重试') + elif hash_v_e: + return Response(hash_v_e) def get_serializer_class(self): action_serializer_name = f"{self.action}_serializer_class"