def _generate_cache_key(view, queryset): view_name = view.__class__.__name__ try: key_str = queryset.query.__str__() except EmptyResultSet: # 无查询的空对象 key_str = 'EmptyResultSet' query_data_fields = getattr(view, 'query_data_fields', []) query_data_fields.sort() key_str = '%s:%s' % (key_str, md5(json.dumps(query_data_fields))) cache_key_prefix = view.get_cache_key_prefix() if cache_key_prefix is not None: key_str = '%s:%s' % (cache_key_prefix, key_str) return md5('%s:%s' % (view_name, key_str))
def default_key_func(method, *args, **kwargs): arg_dict = inspect.getcallargs(method, *args, **kwargs) arg_dict.update({ '__qualname__': method.__qualname__, '__module__': method.__module__, }) arg_dict.pop('self', None) arg_dict.pop('cls', None) return md5(json.dumps(arg_dict, sort_keys=True).encode('utf-8'))
def sync_openid(openid): if not openid: return None if not WeUser.objects.filter(openid=openid).exists(): with transaction.atomic(): user = User.objects.create(username=openid) WeUser.objects.create( user=user, openid=openid, openid_key=md5(openid), )
def get_func_key(func): """ 获取函数识别键,顶层函数模块名区分,内部函数id区分 :param func: 函数 :return: 函数识别键 """ func_name = func.__qualname__ complete_func_name = f'{func.__module__}.{func_name}' if '<locals>' in func_name.split('.'): complete_func_name = f'{complete_func_name}-{id(func)}' return md5(complete_func_name)
def _exe_key(func, args, kwargs): """方法识别key :param func: 待执行方法 :param args: 方法args参数 :param kwargs: 方法kwargs参数 :return: 方法识别key """ exe_key = md5('{func}(*{args}, **{kwargs})'.format( func=pickle.dumps(func), args=pickle.dumps(args), kwargs=pickle.dumps(kwargs), )) return exe_key
def _get_serializer_key(serializer, fields=None): """ 获取序列化键 :param serializer: 序列化对象 :param fields: 关联字段 :return: 序列化键 """ validated_data = serializer.validated_data fields = fields if fields is not None else validated_data.keys() values = [str(validated_data.get(field) or '') for field in fields] value_str = '|'.join(values) serializer_class = serializer.__class__ return md5( f'{serializer_class.__module__}.{serializer_class.__qualname__}:{value_str}' )
def get_version(cls, name): return md5('%s:cache' % name)