Ticket #5813: cache_middleware_respect_maxage.diff

File cache_middleware_respect_maxage.diff, 4.5 KB (added by Chris Beaven, 17 years ago)
  • docs/cache.txt

     
    263263
    264264.. _`middleware documentation`: ../middleware/
    265265
     266**New in Django development version**
     267
     268If the view sets its own cache expiry time (i.e. has a ``max-age`` section in
     269it's ``Cache-Control`` header) then the page will be cached for the length of
     270time given in there, rather than ``CACHE_MIDDLEWARE_SECONDS``. Using the
     271decorators in ``django.views.decorators.cache`` you can easily set a view's
     272expiry time (by using the ``cache_control`` decorator) or disable caching for a
     273view (by using the ``never_cache`` decorator). See the `using other headers`__
     274section for more on these decorators.
     275
     276__ `Controlling cache: Using other headers`_
     277
    266278The per-view cache
    267279==================
    268280
     
    564576precedence, and the header values will be merged correctly.)
    565577
    566578If you want to use headers to disable caching altogether,
    567 ``django.views.decorators.never_cache`` is a view decorator that adds
     579``django.views.decorators.cache.never_cache`` is a view decorator that adds
    568580headers to ensure the response won't be cached by browsers or other caches. Example::
    569581
    570582    from django.views.decorators.cache import never_cache
  • django/utils/cache.py

     
    6969    cc = ', '.join([dictvalue(el) for el in cc.items()])
    7070    response['Cache-Control'] = cc
    7171
     72def get_max_age(response):
     73    """
     74    Returns the max-age from the response Cache-Control header as an integer (or
     75    ``None`` if it wasn't found or wasn't an integer.
     76    """
     77    def dictitem(s):
     78        t = s.split('=',1)
     79        if len(t) > 1:
     80            return (t[0].lower(), t[1])
     81        else:
     82            return (t[0].lower(), True)
     83    if response.has_header('Cache-Control'):
     84        cc = cc_delim_re.split(response['Cache-Control'])
     85        cc = dict([dictitem(el) for el in cc])
     86        if 'max-age' in cc:
     87            try:
     88                return int(cc['max-age'])
     89            except ValueError, TypeError:
     90                pass
     91    return None
     92
    7293vary_delim_re = re.compile(r',\s*')
    7394
    7495def patch_response_headers(response, cache_timeout=None):
  • django/middleware/cache.py

     
    11from django.conf import settings
    22from django.core.cache import cache
    3 from django.utils.cache import get_cache_key, learn_cache_key, patch_response_headers
     3from django.utils.cache import get_cache_key, learn_cache_key, patch_response_headers, get_max_age
    44
    55class CacheMiddleware(object):
    66    """
    77    Cache middleware. If this is enabled, each Django-powered page will be
    8     cached for CACHE_MIDDLEWARE_SECONDS seconds. Cache is based on URLs.
     8    cached (based on URLs).
    99
    1010    Only parameter-less GET or HEAD-requests with status code 200 are cached.
    1111
     12    The number of seconds each page is stored for is set by the
     13    "max-age" section of the response's "Cache-Control" header, falling back to
     14    the CACHE_MIDDLEWARE_SECONDS setting if the section was not found.
     15
    1216    If CACHE_MIDDLEWARE_ANONYMOUS_ONLY is set to True, only anonymous requests
    1317    (i.e., those not made by a logged-in user) will be cached. This is a
    1418    simple and effective way of avoiding the caching of the Django admin (and
     
    7882            return response
    7983        if not response.status_code == 200:
    8084            return response
    81         patch_response_headers(response, self.cache_timeout)
    82         cache_key = learn_cache_key(request, response, self.cache_timeout, self.key_prefix)
    83         cache.set(cache_key, response, self.cache_timeout)
     85        # Try to get the timeout from the "max-age" section of the "Cache-
     86        # Control" header before reverting to using the default cache_timeout
     87        # length.
     88        timeout = get_max_age(response)
     89        if timeout == None:
     90            timeout = self.cache_timeout
     91        elif timeout == 0:
     92            # max-age was set to 0, don't bother caching.
     93            return response
     94        patch_response_headers(response, timeout)
     95        cache_key = learn_cache_key(request, response, timeout, self.key_prefix)
     96        cache.set(cache_key, response, timeout)
    8497        return response
Back to Top