feat: 接口增加默认缓存时间

This commit is contained in:
caoqianming 2023-05-25 10:45:41 +08:00
parent 3d9f04a443
commit 5131daa5cd
2 changed files with 22 additions and 10 deletions

View File

@ -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')

View File

@ -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"