|
0
|
1 |
""" |
|
|
2 |
Decorator for views that tries getting the page from the cache and |
|
|
3 |
populates the cache if the page isn't in the cache yet. |
|
|
4 |
|
|
|
5 |
The cache is keyed by the URL and some data from the headers. Additionally |
|
|
6 |
there is the key prefix that is used to distinguish different cache areas |
|
|
7 |
in a multi-site setup. You could use the sites.get_current().domain, for |
|
|
8 |
example, as that is unique across a Django project. |
|
|
9 |
|
|
|
10 |
Additionally, all headers from the response's Vary header will be taken into |
|
|
11 |
account on caching -- just like the middleware does. |
|
|
12 |
""" |
|
|
13 |
|
|
|
14 |
try: |
|
|
15 |
from functools import wraps |
|
|
16 |
except ImportError: |
|
|
17 |
from django.utils.functional import wraps # Python 2.3, 2.4 fallback. |
|
|
18 |
|
|
|
19 |
from django.utils.decorators import decorator_from_middleware |
|
|
20 |
from django.utils.cache import patch_cache_control, add_never_cache_headers |
|
|
21 |
from django.middleware.cache import CacheMiddleware |
|
|
22 |
|
|
|
23 |
cache_page = decorator_from_middleware(CacheMiddleware) |
|
|
24 |
|
|
|
25 |
def cache_control(**kwargs): |
|
|
26 |
|
|
|
27 |
def _cache_controller(viewfunc): |
|
|
28 |
|
|
|
29 |
def _cache_controlled(request, *args, **kw): |
|
|
30 |
response = viewfunc(request, *args, **kw) |
|
|
31 |
patch_cache_control(response, **kwargs) |
|
|
32 |
return response |
|
|
33 |
|
|
|
34 |
return wraps(viewfunc)(_cache_controlled) |
|
|
35 |
|
|
|
36 |
return _cache_controller |
|
|
37 |
|
|
|
38 |
def never_cache(view_func): |
|
|
39 |
""" |
|
|
40 |
Decorator that adds headers to a response so that it will |
|
|
41 |
never be cached. |
|
|
42 |
""" |
|
|
43 |
def _wrapped_view_func(request, *args, **kwargs): |
|
|
44 |
response = view_func(request, *args, **kwargs) |
|
|
45 |
add_never_cache_headers(response) |
|
|
46 |
return response |
|
|
47 |
return wraps(view_func)(_wrapped_view_func) |