15
15
from functools import wraps
16
16
except ImportError:
17
from django.utils.functional import wraps # Python 2.3, 2.4 fallback.
17
from django.utils.functional import wraps # Python 2.4 fallback.
19
from django.utils.decorators import decorator_from_middleware
19
from django.utils.decorators import decorator_from_middleware_with_args, available_attrs
20
20
from django.utils.cache import patch_cache_control, add_never_cache_headers
21
21
from django.middleware.cache import CacheMiddleware
23
cache_page = decorator_from_middleware(CacheMiddleware)
24
def cache_page(*args, **kwargs):
25
# We need backwards compatibility with code which spells it this way:
27
# my_view = cache_page(my_view, 123)
29
# my_view = cache_page(123)(my_view)
31
# my_view = cache_page(my_view, 123, key_prefix="foo")
33
# my_view = cache_page(123, key_prefix="foo")(my_view)
34
# and possibly this way (?):
35
# my_view = cache_page(123, my_view)
37
# We also add some asserts to give better error messages in case people are
38
# using other ways to call cache_page that no longer work.
39
key_prefix = kwargs.pop('key_prefix', None)
40
assert not kwargs, "The only keyword argument accepted is key_prefix"
42
assert len(args) == 2, "cache_page accepts at most 2 arguments"
44
return decorator_from_middleware_with_args(CacheMiddleware)(cache_timeout=args[1], key_prefix=key_prefix)(args[0])
45
elif callable(args[1]):
46
return decorator_from_middleware_with_args(CacheMiddleware)(cache_timeout=args[0], key_prefix=key_prefix)(args[1])
48
assert False, "cache_page must be passed either a single argument (timeout) or a view function and a timeout"
50
return decorator_from_middleware_with_args(CacheMiddleware)(cache_timeout=args[0], key_prefix=key_prefix)
25
53
def cache_control(**kwargs):
27
54
def _cache_controller(viewfunc):
29
55
def _cache_controlled(request, *args, **kw):
30
56
response = viewfunc(request, *args, **kw)
31
57
patch_cache_control(response, **kwargs)
34
return wraps(viewfunc)(_cache_controlled)
59
return wraps(viewfunc, assigned=available_attrs(viewfunc))(_cache_controlled)
36
60
return _cache_controller
38
63
def never_cache(view_func):
40
65
Decorator that adds headers to a response so that it will