diff --git a/apps/perms/api/user_permission.py b/apps/perms/api/user_permission.py index 0fc35e9ef..e152f82b8 100644 --- a/apps/perms/api/user_permission.py +++ b/apps/perms/api/user_permission.py @@ -48,28 +48,34 @@ class UserPermissionMixin: kwargs.get('pk') is None: set_to_root_org() - def get_response_from_cache(self, request): - if self.cache_policy in ['1', 'using']: - path_md5 = md5(request.get_full_path().encode()).hexdigest() - obj = self.get_object() - util = AssetPermissionUtil(obj, cache_policy=self.cache_policy) - cache_id = '{}_{}'.format(path_md5, util.cache_meta.get('id')) - response = self.get_cache_response(cache_id) - return response + def get_object(self): return None def get(self, request, *args, **kwargs): self.change_org_if_need(request, kwargs) self.cache_policy = request.GET.get('cache_policy', '0') - path_md5 = md5(request.get_full_path().encode()).hexdigest() - path_cache_key = '{}_{}'.format(path_md5, '*') - if self.cache_policy in AssetPermissionUtil.CACHE_POLICY_MAP[0]: + + obj = self.get_object() + if obj is None: + return super().get(request, *args, **kwargs) + request_path_md5 = md5(request.get_full_path().encode()).hexdigest() + obj_id = str(obj.id) + expire_cache_key = '{}_{}'.format(obj_id, '*') + if self.CACHE_TIME <= 0 or \ + self.cache_policy in AssetPermissionUtil.CACHE_POLICY_MAP[0]: return super().get(request, *args, **kwargs) elif self.cache_policy in AssetPermissionUtil.CACHE_POLICY_MAP[2]: - self.expire_cache_response(path_cache_key) - obj = self.get_object() + self.expire_cache_response(expire_cache_key) + util = AssetPermissionUtil(obj, cache_policy=self.cache_policy) - cache_id = '{}_{}'.format(path_md5, util.cache_meta.get('id')) + meta_cache_id = util.cache_meta.get('id') + cache_id = '{}_{}_{}'.format(obj_id, request_path_md5, meta_cache_id) + # 没有数据缓冲 + if not meta_cache_id: + response = super().get(request, *args, **kwargs) + self.set_cache_response(cache_id, response) + return response + # 从响应缓冲里获取响应 response = self.get_cache_response(cache_id) if not response: response = super().get(request, *args, **kwargs) diff --git a/apps/perms/signals_handler.py b/apps/perms/signals_handler.py index 4521fef3c..7876d7642 100644 --- a/apps/perms/signals_handler.py +++ b/apps/perms/signals_handler.py @@ -11,12 +11,12 @@ from .models import AssetPermission logger = get_logger(__file__) -@receiver(post_save) +@receiver(post_save, sender=AssetPermission) def on_permission_update(sender, **kwargs): AssetPermissionUtil.expire_all_cache() -@receiver(post_delete) +@receiver(post_delete, sender=AssetPermission) def on_permission_delete(sender, **kwargs): AssetPermissionUtil.expire_all_cache() diff --git a/apps/perms/utils.py b/apps/perms/utils.py index d80f272f2..a40362186 100644 --- a/apps/perms/utils.py +++ b/apps/perms/utils.py @@ -177,7 +177,7 @@ class AssetPermissionUtil: return cached def get_assets(self): - if self.cache_policy in self.CACHE_POLICY_MAP[1]: + if self.CACHE_TIME <= 0 or self.cache_policy in self.CACHE_POLICY_MAP[1]: return self.get_assets_from_cache() elif self.cache_policy in self.CACHE_POLICY_MAP[2]: self.expire_cache() @@ -206,7 +206,7 @@ class AssetPermissionUtil: return cached def get_nodes_with_assets(self): - if self.cache_policy in self.CACHE_POLICY_MAP[1]: + if self.CACHE_TIME <= 0 or self.cache_policy in self.CACHE_POLICY_MAP[1]: return self.get_nodes_with_assets_from_cache() elif self.cache_policy in self.CACHE_POLICY_MAP[2]: self.expire_cache() @@ -229,7 +229,7 @@ class AssetPermissionUtil: return cached def get_system_users(self): - if self.cache_policy in self.CACHE_POLICY_MAP[1]: + if self.CACHE_TIME <= 0 or self.cache_policy in self.CACHE_POLICY_MAP[1]: return self.get_system_user_from_cache() elif self.cache_policy in self.CACHE_POLICY_MAP[2]: self.expire_cache()