def wrapped(request, *args, **kwargs): if not request_gatekeeper(request, *args, **kwargs): return func(request, *args, **kwargs) key_args = key # Default key. if not key_args: # Don't naively add the `request` arg to the cache key. key_args = _make_key_args_from_function(func, *args, **kwargs) # Only add specific parts of the `request` object to the key. key_args.extend(chain.from_iterable(request.GET.items())) key_args.append(request.method) # Current language. key_args.append(translation.get_language()) # Current site, if available. key_args.append(getattr(settings, 'SITE_ID', None)) if add_user_to_key and request.user.is_authenticated(): key_args = chain(key_arg_iterator(key_args, max_depth=0), [request.user.id]) # Serialize the key. # Add `request` to `args` since _make_key wants all func args in it. _args = (request, ) + args _namespace = None if namespace is not None: _namespace = _make_key_for_func(namespace, _args, kwargs, skip_prefix=True) _key = _make_key_for_func(key_args, _args, kwargs, namespace=_namespace) resp = None val = cache.cache.get(_key) logger.debug(u'getting cache from {}: {}'.format(_key, val)) if val is None: resp = func(request, *args, **kwargs) if response_gatekeeper(resp): set_cache(_key, serializer(resp), timeout) else: resp = cached_response_wrapper(val) return resp
def wrapped(request, *args, **kwargs): if not request_gatekeeper(request, *args, **kwargs): return func(request, *args, **kwargs) key_args = key # Default key. if not key_args: # Don't naively add the `request` arg to the cache key. key_args = _make_key_args_from_function(func, *args, **kwargs) # Only add specific parts of the `request` object to the key. key_args.extend(chain.from_iterable(request.GET.items())) key_args.append(request.method) # Current language. key_args.append(translation.get_language()) # Current site, if available. key_args.append(getattr(settings, 'SITE_ID', None)) if add_user_to_key and request.user.is_authenticated(): key_args = chain(key_arg_iterator(key_args, max_depth=0), [request.user.id]) # Serialize the key. # Add `request` to `args` since _make_key wants all func args in it. _args = (request,) + args _namespace = None if namespace is not None: _namespace = _make_key_for_func(namespace, _args, kwargs, skip_prefix=True) _key = _make_key_for_func(key_args, _args, kwargs, namespace=_namespace) resp = None val = cache.cache.get(_key) logger.debug(u'getting cache from {}: {}'.format(_key, val)) if val is None: resp = func(request, *args, **kwargs) if response_gatekeeper(resp): set_cache(_key, serializer(resp), timeout) else: resp = cached_response_wrapper(val) return resp
def _make_key_for_func(key_args, func_args, func_kwargs, namespace=None, skip_prefix=False): ''' Returns the cache key to use for the decorated function. Calls and replaces any callable items in `key_args` with their return values before sending `key_args` over to `make_key`. Does the same for a callable `namespace`. ''' def call_if_callable(obj): if callable(obj): return obj(*func_args, **func_kwargs) return obj key_args = call_if_callable(key_args) key_args = map(call_if_callable, key_arg_iterator(key_args)) return make_key(key_args, namespace=namespace, skip_prefix=skip_prefix)
def delete_cache(*args, **kwargs): key_args = key or _make_key_args_from_function(func, *args, **kwargs) if add_user_to_key and kwargs.get('user') is not None: # We can assume that key is specified (see cached_view's docstring). key_args = chain(key_arg_iterator(key_args, max_depth=0), [kwargs['user']]) _namespace = None if namespace is not None: _namespace = _make_key_for_func(namespace, args, kwargs, skip_prefix=True) _key = _make_key_for_func(key_args, args, kwargs, namespace=_namespace) logger.debug(u'deleting cache for key: {}'.format(_key)) cache.cache.delete(_key)
def test_key_arg_iterator(self): args = ['a', 'b', 1, 2, [3, 4], [5, [6, 7]]] flat_args = ['a', 'b', 1, 2, 3, 4, 5, [6, 7]] # Only flattened one level iterated_args = list(key_arg_iterator(args, max_depth=1)) self.assertEqual(iterated_args, flat_args)