equal
deleted
inserted
replaced
15 |
15 |
16 An example: i18n middleware would need to distinguish caches by the |
16 An example: i18n middleware would need to distinguish caches by the |
17 "Accept-language" header. |
17 "Accept-language" header. |
18 """ |
18 """ |
19 |
19 |
20 import md5 |
|
21 import re |
20 import re |
22 import time |
21 import time |
23 try: |
22 try: |
24 set |
23 set |
25 except NameError: |
24 except NameError: |
27 |
26 |
28 from django.conf import settings |
27 from django.conf import settings |
29 from django.core.cache import cache |
28 from django.core.cache import cache |
30 from django.utils.encoding import smart_str, iri_to_uri |
29 from django.utils.encoding import smart_str, iri_to_uri |
31 from django.utils.http import http_date |
30 from django.utils.http import http_date |
|
31 from django.utils.hashcompat import md5_constructor |
32 |
32 |
33 cc_delim_re = re.compile(r'\s*,\s*') |
33 cc_delim_re = re.compile(r'\s*,\s*') |
34 |
34 |
35 def patch_cache_control(response, **kwargs): |
35 def patch_cache_control(response, **kwargs): |
36 """ |
36 """ |
62 cc = dict([dictitem(el) for el in cc]) |
62 cc = dict([dictitem(el) for el in cc]) |
63 else: |
63 else: |
64 cc = {} |
64 cc = {} |
65 |
65 |
66 # If there's already a max-age header but we're being asked to set a new |
66 # If there's already a max-age header but we're being asked to set a new |
67 # max-age, use the minumum of the two ages. In practice this happens when |
67 # max-age, use the minimum of the two ages. In practice this happens when |
68 # a decorator and a piece of middleware both operate on a given view. |
68 # a decorator and a piece of middleware both operate on a given view. |
69 if 'max-age' in cc and 'max_age' in kwargs: |
69 if 'max-age' in cc and 'max_age' in kwargs: |
70 kwargs['max_age'] = min(cc['max-age'], kwargs['max_age']) |
70 kwargs['max_age'] = min(cc['max-age'], kwargs['max_age']) |
71 |
71 |
72 for (k, v) in kwargs.items(): |
72 for (k, v) in kwargs.items(): |
102 if cache_timeout is None: |
102 if cache_timeout is None: |
103 cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS |
103 cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS |
104 if cache_timeout < 0: |
104 if cache_timeout < 0: |
105 cache_timeout = 0 # Can't have max-age negative |
105 cache_timeout = 0 # Can't have max-age negative |
106 if not response.has_header('ETag'): |
106 if not response.has_header('ETag'): |
107 response['ETag'] = md5.new(response.content).hexdigest() |
107 response['ETag'] = '"%s"' % md5_constructor(response.content).hexdigest() |
108 if not response.has_header('Last-Modified'): |
108 if not response.has_header('Last-Modified'): |
109 response['Last-Modified'] = http_date() |
109 response['Last-Modified'] = http_date() |
110 if not response.has_header('Expires'): |
110 if not response.has_header('Expires'): |
111 response['Expires'] = http_date(time.time() + cache_timeout) |
111 response['Expires'] = http_date(time.time() + cache_timeout) |
112 patch_cache_control(response, max_age=cache_timeout) |
112 patch_cache_control(response, max_age=cache_timeout) |
136 if newheader.lower() not in existing_headers] |
136 if newheader.lower() not in existing_headers] |
137 response['Vary'] = ', '.join(vary_headers + additional_headers) |
137 response['Vary'] = ', '.join(vary_headers + additional_headers) |
138 |
138 |
139 def _generate_cache_key(request, headerlist, key_prefix): |
139 def _generate_cache_key(request, headerlist, key_prefix): |
140 """Returns a cache key from the headers given in the header list.""" |
140 """Returns a cache key from the headers given in the header list.""" |
141 ctx = md5.new() |
141 ctx = md5_constructor() |
142 for header in headerlist: |
142 for header in headerlist: |
143 value = request.META.get(header, None) |
143 value = request.META.get(header, None) |
144 if value is not None: |
144 if value is not None: |
145 ctx.update(value) |
145 ctx.update(value) |
146 return 'views.decorators.cache.cache_page.%s.%s.%s' % ( |
146 return 'views.decorators.cache.cache_page.%s.%s.%s' % ( |