Пример #1
0
        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
Пример #2
0
        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
Пример #3
0
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)
Пример #4
0
    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)
Пример #5
0
    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)
Пример #6
0
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)
Пример #7
0
 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)