Commit c3308442 authored by ibuler's avatar ibuler

[Update] Debug cache

parent 7f7853db
...@@ -151,7 +151,7 @@ function initTree() { ...@@ -151,7 +151,7 @@ function initTree() {
} }
$(document).ready(function () { $(document).ready(function () {
initTree(); {#initTree();#}
initTable(); initTable();
}).on('click', '.labels li', function () { }).on('click', '.labels li', function () {
var val = $(this).text(); var val = $(this).text();
......
...@@ -5,3 +5,4 @@ from .asset_permission import * ...@@ -5,3 +5,4 @@ from .asset_permission import *
from .user_permission import * from .user_permission import *
from .user_group_permission import * from .user_group_permission import *
from .remote_app_permission import * from .remote_app_permission import *
from .user_remote_app_permission import *
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
import time import time
import traceback
from hashlib import md5 from hashlib import md5
from django.core.cache import cache from django.core.cache import cache
from django.conf import settings from django.conf import settings
...@@ -16,16 +17,12 @@ from common.tree import TreeNodeSerializer ...@@ -16,16 +17,12 @@ from common.tree import TreeNodeSerializer
from common.utils import get_logger from common.utils import get_logger
from ..utils import ( from ..utils import (
AssetPermissionUtil, parse_asset_to_tree_node, parse_node_to_tree_node, AssetPermissionUtil, parse_asset_to_tree_node, parse_node_to_tree_node,
check_system_user_action, RemoteAppPermissionUtil, check_system_user_action,
construct_remote_apps_tree_root, parse_remote_app_to_tree_node,
)
from ..hands import (
User, Asset, Node, SystemUser, RemoteApp,
NodeSerializer, RemoteAppSerializer,
) )
from ..hands import User, Asset, Node, SystemUser, NodeSerializer
from .. import serializers, const from .. import serializers, const
from ..mixins import ( from ..mixins import (
AssetsFilterMixin, RemoteAppFilterMixin AssetsFilterMixin,
) )
from ..models import Action from ..models import Action
...@@ -36,8 +33,6 @@ __all__ = [ ...@@ -36,8 +33,6 @@ __all__ = [
'UserGrantedNodesWithAssetsApi', 'UserGrantedNodeAssetsApi', 'UserGrantedNodesWithAssetsApi', 'UserGrantedNodeAssetsApi',
'ValidateUserAssetPermissionApi', 'UserGrantedNodeChildrenApi', 'ValidateUserAssetPermissionApi', 'UserGrantedNodeChildrenApi',
'UserGrantedNodesWithAssetsAsTreeApi', 'GetUserAssetPermissionActionsApi', 'UserGrantedNodesWithAssetsAsTreeApi', 'GetUserAssetPermissionActionsApi',
'UserGrantedRemoteAppsApi', 'ValidateUserRemoteAppPermissionApi',
'UserGrantedRemoteAppsAsTreeApi',
] ]
...@@ -77,46 +72,61 @@ class UserPermissionCacheMixin: ...@@ -77,46 +72,61 @@ class UserPermissionCacheMixin:
request_md5 = self.get_request_md5() request_md5 = self.get_request_md5()
meta_cache_id = self.get_meta_cache_id() meta_cache_id = self.get_meta_cache_id()
resp_cache_id = '{}_{}_{}'.format(obj_id, request_md5, meta_cache_id) resp_cache_id = '{}_{}_{}'.format(obj_id, request_md5, meta_cache_id)
resp_cache_id = md5(resp_cache_id.encode()).hexdigest()
return resp_cache_id return resp_cache_id
def get_response_from_cache(self): def get_response_from_cache(self):
resp_cache_id = self.get_response_cache_id()
# 没有数据缓冲 # 没有数据缓冲
meta_cache_id = self.get_meta_cache_id() meta_cache_id = self.get_meta_cache_id()
if not meta_cache_id: if not meta_cache_id:
logger.debug("Not get meta id: {}".format(meta_cache_id))
return None return None
# 从响应缓冲里获取响应 # 从响应缓冲里获取响应
key = self.RESP_CACHE_KEY.format(resp_cache_id) key = self.get_response_key()
print("response key: {}".format(key))
data = cache.get(key) data = cache.get(key)
print(data)
if not data: if not data:
logger.debug("Not get response from cache: {}".format(key))
return None return None
logger.debug("Get user permission from cache: {}".format(self.get_object())) logger.debug("Get user permission from cache: {}".format(self.get_object()))
response = Response(data) response = Response(data)
return response return response
def expire_response_cache(self): def expire_response_cache(self):
print("Expire cache")
obj_id = self.get_object_id() obj_id = self.get_object_id()
expire_cache_id = '{}_{}'.format(obj_id, '*') expire_cache_id = '{}_{}'.format(obj_id, '*')
key = self.RESP_CACHE_KEY.format(expire_cache_id) key = self.RESP_CACHE_KEY.format(expire_cache_id)
cache.delete_pattern(key) cache.delete_pattern(key)
def set_response_to_cache(self, response): def get_response_key(self):
resp_cache_id = self.get_response_cache_id() resp_cache_id = self.get_response_cache_id()
key = self.RESP_CACHE_KEY.format(resp_cache_id) key = self.RESP_CACHE_KEY.format(resp_cache_id)
return key
def set_response_to_cache(self, response):
key = self.get_response_key()
cache.set(key, response.data, self.CACHE_TIME) cache.set(key, response.data, self.CACHE_TIME)
logger.debug("Set response to cache: {}".format(key))
print(self.CACHE_TIME)
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
self.cache_policy = request.GET.get('cache_policy', '0') self.cache_policy = request.GET.get('cache_policy', '0')
obj = self._get_object() obj = self._get_object()
if obj is None: if obj is None:
logger.debug("Not get response from cache: obj is none")
return super().get(request, *args, **kwargs) return super().get(request, *args, **kwargs)
if AssetPermissionUtil.is_not_using_cache(self.cache_policy): if AssetPermissionUtil.is_not_using_cache(self.cache_policy):
logger.debug("Not get resp from cache: {}".format(self.cache_policy))
return super().get(request, *args, **kwargs) return super().get(request, *args, **kwargs)
elif AssetPermissionUtil.is_refresh_cache(self.cache_policy): elif AssetPermissionUtil.is_refresh_cache(self.cache_policy):
logger.debug("Not get resp from cache: {}".format(self.cache_policy))
self.expire_response_cache() self.expire_response_cache()
logger.debug("Try get response from cache")
resp = self.get_response_from_cache() resp = self.get_response_from_cache()
if not resp: if not resp:
resp = super().get(request, *args, **kwargs) resp = super().get(request, *args, **kwargs)
...@@ -245,11 +255,8 @@ class UserGrantedNodesWithAssetsAsTreeApi(UserPermissionCacheMixin, ListAPIView) ...@@ -245,11 +255,8 @@ class UserGrantedNodesWithAssetsAsTreeApi(UserPermissionCacheMixin, ListAPIView)
user = get_object_or_404(User, id=user_id) user = get_object_or_404(User, id=user_id)
return user return user
def list(self, request, *args, **kwargs):
resp = super().list(request, *args, **kwargs)
return resp
def get_queryset(self): def get_queryset(self):
print("Call get queryset")
queryset = [] queryset = []
self.show_assets = self.request.query_params.get('show_assets', '1') == '1' self.show_assets = self.request.query_params.get('show_assets', '1') == '1'
self.system_user_id = self.request.query_params.get('system_user') self.system_user_id = self.request.query_params.get('system_user')
...@@ -259,22 +266,14 @@ class UserGrantedNodesWithAssetsAsTreeApi(UserPermissionCacheMixin, ListAPIView) ...@@ -259,22 +266,14 @@ class UserGrantedNodesWithAssetsAsTreeApi(UserPermissionCacheMixin, ListAPIView)
util.filter_permissions( util.filter_permissions(
system_users=self.system_user_id system_users=self.system_user_id
) )
print("111111111111")
nodes = util.get_nodes_with_assets() nodes = util.get_nodes_with_assets()
print("22222222222222")
for node, assets in nodes.items(): for node, assets in nodes.items():
now = time.time()
print("Parse to node")
data = parse_node_to_tree_node(node) data = parse_node_to_tree_node(node)
print("parse to node end, using: {0:.2f}".format(time.time() - now))
queryset.append(data) queryset.append(data)
if not self.show_assets: if not self.show_assets:
continue continue
for asset, system_users in assets.items(): for asset, system_users in assets.items():
now1 = time.time()
print("parse to asset")
data = parse_asset_to_tree_node(node, asset, system_users) data = parse_asset_to_tree_node(node, asset, system_users)
print("parse to asset end, using: {0:.2f}".format(time.time()-now1))
queryset.append(data) queryset.append(data)
return queryset return queryset
...@@ -458,77 +457,3 @@ class GetUserAssetPermissionActionsApi(UserPermissionCacheMixin, APIView): ...@@ -458,77 +457,3 @@ class GetUserAssetPermissionActionsApi(UserPermissionCacheMixin, APIView):
return Response({'actions': actions}, status=200) return Response({'actions': actions}, status=200)
# RemoteApp permission
class UserGrantedRemoteAppsApi(RemoteAppFilterMixin, ListAPIView):
permission_classes = (IsOrgAdminOrAppUser,)
serializer_class = RemoteAppSerializer
pagination_class = LimitOffsetPagination
def get_object(self):
user_id = self.kwargs.get('pk', '')
if user_id:
user = get_object_or_404(User, id=user_id)
else:
user = self.request.user
return user
def get_queryset(self):
util = RemoteAppPermissionUtil(self.get_object())
queryset = util.get_remote_apps()
queryset = list(queryset)
return queryset
def get_permissions(self):
if self.kwargs.get('pk') is None:
self.permission_classes = (IsValidUser,)
return super().get_permissions()
class UserGrantedRemoteAppsAsTreeApi(ListAPIView):
serializer_class = TreeNodeSerializer
permission_classes = (IsOrgAdminOrAppUser,)
def get_object(self):
user_id = self.kwargs.get('pk', '')
if not user_id:
user = self.request.user
else:
user = get_object_or_404(User, id=user_id)
return user
def get_queryset(self):
queryset = []
tree_root = construct_remote_apps_tree_root()
queryset.append(tree_root)
util = RemoteAppPermissionUtil(self.get_object())
remote_apps = util.get_remote_apps()
for remote_app in remote_apps:
node = parse_remote_app_to_tree_node(tree_root, remote_app)
queryset.append(node)
queryset = sorted(queryset)
return queryset
def get_permissions(self):
if self.kwargs.get('pk') is None:
self.permission_classes = (IsValidUser,)
return super().get_permissions()
class ValidateUserRemoteAppPermissionApi(APIView):
permission_classes = (IsOrgAdminOrAppUser,)
def get(self, request, *args, **kwargs):
self.change_org_if_need(request, kwargs)
user_id = request.query_params.get('user_id', '')
remote_app_id = request.query_params.get('remote_app_id', '')
user = get_object_or_404(User, id=user_id)
remote_app = get_object_or_404(RemoteApp, id=remote_app_id)
util = RemoteAppPermissionUtil(user)
remote_apps = util.get_remote_apps()
if remote_app not in remote_apps:
return Response({'msg': False}, status=403)
return Response({'msg': True}, status=200)
# -*- coding: utf-8 -*-
from django.shortcuts import get_object_or_404
from rest_framework.views import APIView, Response
from rest_framework.generics import (
ListAPIView, get_object_or_404,
)
from rest_framework.pagination import LimitOffsetPagination
from common.permissions import IsValidUser, IsOrgAdminOrAppUser
from common.tree import TreeNodeSerializer
from ..utils import (
RemoteAppPermissionUtil, construct_remote_apps_tree_root,
parse_remote_app_to_tree_node,
)
from ..hands import User, RemoteApp, RemoteAppSerializer
from ..mixins import RemoteAppFilterMixin
__all__ = [
'UserGrantedRemoteAppsApi', 'ValidateUserRemoteAppPermissionApi',
'UserGrantedRemoteAppsAsTreeApi',
]
class UserGrantedRemoteAppsApi(RemoteAppFilterMixin, ListAPIView):
permission_classes = (IsOrgAdminOrAppUser,)
serializer_class = RemoteAppSerializer
pagination_class = LimitOffsetPagination
def get_object(self):
user_id = self.kwargs.get('pk', '')
if user_id:
user = get_object_or_404(User, id=user_id)
else:
user = self.request.user
return user
def get_queryset(self):
util = RemoteAppPermissionUtil(self.get_object())
queryset = util.get_remote_apps()
queryset = list(queryset)
return queryset
def get_permissions(self):
if self.kwargs.get('pk') is None:
self.permission_classes = (IsValidUser,)
return super().get_permissions()
class UserGrantedRemoteAppsAsTreeApi(ListAPIView):
serializer_class = TreeNodeSerializer
permission_classes = (IsOrgAdminOrAppUser,)
def get_object(self):
user_id = self.kwargs.get('pk', '')
if not user_id:
user = self.request.user
else:
user = get_object_or_404(User, id=user_id)
return user
def get_queryset(self):
queryset = []
tree_root = construct_remote_apps_tree_root()
queryset.append(tree_root)
util = RemoteAppPermissionUtil(self.get_object())
remote_apps = util.get_remote_apps()
for remote_app in remote_apps:
node = parse_remote_app_to_tree_node(tree_root, remote_app)
queryset.append(node)
queryset = sorted(queryset)
return queryset
def get_permissions(self):
if self.kwargs.get('pk') is None:
self.permission_classes = (IsValidUser,)
return super().get_permissions()
class ValidateUserRemoteAppPermissionApi(APIView):
permission_classes = (IsOrgAdminOrAppUser,)
def get(self, request, *args, **kwargs):
user_id = request.query_params.get('user_id', '')
remote_app_id = request.query_params.get('remote_app_id', '')
user = get_object_or_404(User, id=user_id)
remote_app = get_object_or_404(RemoteApp, id=remote_app_id)
util = RemoteAppPermissionUtil(user)
remote_apps = util.get_remote_apps()
if remote_app not in remote_apps:
return Response({'msg': False}, status=403)
return Response({'msg': True}, status=200)
...@@ -110,17 +110,17 @@ class GenerateTree: ...@@ -110,17 +110,17 @@ class GenerateTree:
self._ungroup_node = node self._ungroup_node = node
return node return node
@timeit #@timeit
def add_assets_without_system_users(self, assets): def add_assets_without_system_users(self, assets):
for asset in assets: for asset in assets:
self.add_asset(asset, {}) self.add_asset(asset, {})
@timeit #@timeit
def add_assets(self, assets): def add_assets(self, assets):
for asset, system_users in assets.items(): for asset, system_users in assets.items():
self.add_asset(asset, system_users) self.add_asset(asset, system_users)
@timeit #@timeit
def add_asset(self, asset, system_users=None): def add_asset(self, asset, system_users=None):
nodes = asset.nodes.all() nodes = asset.nodes.all()
nodes = self.node_util.get_nodes_by_queryset(nodes) nodes = self.node_util.get_nodes_by_queryset(nodes)
...@@ -159,7 +159,7 @@ class GenerateTree: ...@@ -159,7 +159,7 @@ class GenerateTree:
self.nodes[node]["system_users"] = system_users self.nodes[node]["system_users"] = system_users
# 添加树节点 # 添加树节点
@timeit #@timeit
def add_nodes(self, nodes): def add_nodes(self, nodes):
_nodes = nodes.keys() _nodes = nodes.keys()
family = self.node_util.get_family(_nodes, with_children=True) family = self.node_util.get_family(_nodes, with_children=True)
...@@ -169,7 +169,7 @@ class GenerateTree: ...@@ -169,7 +169,7 @@ class GenerateTree:
def get_assets(self): def get_assets(self):
return dict(self.assets) return dict(self.assets)
@timeit #@timeit
def get_nodes_with_assets(self): def get_nodes_with_assets(self):
if self._nodes_with_assets: if self._nodes_with_assets:
return self._nodes_with_assets return self._nodes_with_assets
...@@ -220,6 +220,7 @@ class AssetPermissionCacheMixin: ...@@ -220,6 +220,7 @@ class AssetPermissionCacheMixin:
CACHE_META_KEY_PREFIX = '_ASSET_PERM_META_KEY_' CACHE_META_KEY_PREFIX = '_ASSET_PERM_META_KEY_'
CACHE_TIME = settings.ASSETS_PERM_CACHE_TIME CACHE_TIME = settings.ASSETS_PERM_CACHE_TIME
CACHE_POLICY_MAP = (('0', 'never'), ('1', 'using'), ('2', 'refresh')) CACHE_POLICY_MAP = (('0', 'never'), ('1', 'using'), ('2', 'refresh'))
cache_policy = '1'
@classmethod @classmethod
def is_not_using_cache(cls, cache_policy): def is_not_using_cache(cls, cache_policy):
...@@ -242,7 +243,7 @@ class AssetPermissionCacheMixin: ...@@ -242,7 +243,7 @@ class AssetPermissionCacheMixin:
def _is_refresh_cache(self): def _is_refresh_cache(self):
return self.is_refresh_cache(self.cache_policy) return self.is_refresh_cache(self.cache_policy)
@timeit #@timeit
def get_cache_key(self, resource): def get_cache_key(self, resource):
cache_key = self.CACHE_KEY_PREFIX + '{obj_id}_{filter_id}_{resource}' cache_key = self.CACHE_KEY_PREFIX + '{obj_id}_{filter_id}_{resource}'
return cache_key.format( return cache_key.format(
...@@ -250,18 +251,23 @@ class AssetPermissionCacheMixin: ...@@ -250,18 +251,23 @@ class AssetPermissionCacheMixin:
resource=resource resource=resource
) )
@property
def node_key(self): def node_key(self):
return self.get_cache_key('NODES_WITH_ASSETS') return self.get_cache_key('NODES_WITH_ASSETS')
@property
def asset_key(self): def asset_key(self):
return self.get_cache_key('ASSETS') key = self.get_cache_key('ASSETS')
return key
@property
def system_key(self): def system_key(self):
return self.get_cache_key('SYSTEM_USER') return self.get_cache_key('SYSTEM_USER')
def get_assets_from_cache(self): def get_assets_from_cache(self):
cached = cache.get(self.asset_key) cached = cache.get(self.asset_key)
if not cached: if not cached:
print("Refresh cache")
self.update_cache() self.update_cache()
cached = cache.get(self.asset_key) cached = cache.get(self.asset_key)
return cached return cached
...@@ -290,7 +296,7 @@ class AssetPermissionCacheMixin: ...@@ -290,7 +296,7 @@ class AssetPermissionCacheMixin:
return cached return cached
def get_assets(self): def get_assets(self):
if self._is_not_using_cache(): if self._is_using_cache():
return self.get_assets_from_cache() return self.get_assets_from_cache()
elif self._is_refresh_cache(): elif self._is_refresh_cache():
self.expire_cache() self.expire_cache()
...@@ -318,7 +324,10 @@ class AssetPermissionCacheMixin: ...@@ -318,7 +324,10 @@ class AssetPermissionCacheMixin:
@property @property
def cache_meta(self): def cache_meta(self):
key = self.get_meta_cache_key() key = self.get_meta_cache_key()
return cache.get(key) or {} meta = cache.get(key) or {}
# print("Meta key: {}".format(key))
# print("Meta id: {}".format(meta["id"]))
return meta
def set_meta_to_cache(self): def set_meta_to_cache(self):
key = self.get_meta_cache_key() key = self.get_meta_cache_key()
...@@ -327,6 +336,8 @@ class AssetPermissionCacheMixin: ...@@ -327,6 +336,8 @@ class AssetPermissionCacheMixin:
'datetime': timezone.now(), 'datetime': timezone.now(),
'object': str(self.object) 'object': str(self.object)
} }
# print("Set meta key: {}".format(key))
# print("set meta to cache: {}".format(meta["id"]))
cache.set(key, meta, self.CACHE_TIME) cache.set(key, meta, self.CACHE_TIME)
def expire_cache_meta(self): def expire_cache_meta(self):
...@@ -403,13 +414,13 @@ class AssetPermissionUtil(AssetPermissionCacheMixin): ...@@ -403,13 +414,13 @@ class AssetPermissionUtil(AssetPermissionCacheMixin):
self._permissions = permissions self._permissions = permissions
return permissions return permissions
@timeit #@timeit
def filter_permissions(self, **filters): def filter_permissions(self, **filters):
filters_json = json.dumps(filters, sort_keys=True) filters_json = json.dumps(filters, sort_keys=True)
self._permissions = self.permissions.filter(**filters) self._permissions = self.permissions.filter(**filters)
self._filter_id = md5(filters_json.encode()).hexdigest() self._filter_id = md5(filters_json.encode()).hexdigest()
@timeit #@timeit
def get_nodes_direct(self): def get_nodes_direct(self):
""" """
返回用户/组授权规则直接关联的节点 返回用户/组授权规则直接关联的节点
...@@ -425,7 +436,7 @@ class AssetPermissionUtil(AssetPermissionCacheMixin): ...@@ -425,7 +436,7 @@ class AssetPermissionUtil(AssetPermissionCacheMixin):
self.tree.add_nodes(nodes) self.tree.add_nodes(nodes)
return nodes return nodes
@timeit #@timeit
def get_assets_direct(self): def get_assets_direct(self):
""" """
返回用户授权规则直接关联的资产 返回用户授权规则直接关联的资产
...@@ -442,7 +453,7 @@ class AssetPermissionUtil(AssetPermissionCacheMixin): ...@@ -442,7 +453,7 @@ class AssetPermissionUtil(AssetPermissionCacheMixin):
self.tree.add_assets(assets) self.tree.add_assets(assets)
return assets return assets
@timeit #@timeit
def get_assets_without_cache(self): def get_assets_without_cache(self):
""" """
:return: {asset1: set(system_user1,)} :return: {asset1: set(system_user1,)}
...@@ -469,7 +480,7 @@ class AssetPermissionUtil(AssetPermissionCacheMixin): ...@@ -469,7 +480,7 @@ class AssetPermissionUtil(AssetPermissionCacheMixin):
self._assets = assets self._assets = assets
return assets return assets
@timeit #@timeit
def get_nodes_with_assets_without_cache(self): def get_nodes_with_assets_without_cache(self):
""" """
返回节点并且包含资产 返回节点并且包含资产
......
...@@ -145,7 +145,7 @@ function initTree() { ...@@ -145,7 +145,7 @@ function initTree() {
$(document).ready(function () { $(document).ready(function () {
initTree(); initTree();
initTable(); {#initTable();#}
}); });
</script> </script>
{% endblock %} {% endblock %}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment