app/django/utils/cache.py
changeset 323 ff1a9aa48cfd
parent 54 03e267d67478
equal deleted inserted replaced
322:6641e941ef1e 323:ff1a9aa48cfd
    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' % (