Ticket #15499: allow-cache-control-private-override-4.diff

File allow-cache-control-private-override-4.diff, 4.6 KB (added by Andreas Sommer, 13 years ago)

Update for recent trunk

  • django/utils/cache.py

     
    6666    if 'max-age' in cc and 'max_age' in kwargs:
    6767        kwargs['max_age'] = min(cc['max-age'], kwargs['max_age'])
    6868
     69    # Allow overriding private caching and vice versa
     70    if 'private' in cc and 'public' in kwargs:
     71        del cc['private']
     72    elif 'public' in cc and 'private' in kwargs:
     73        del cc['public']
     74
    6975    for (k, v) in kwargs.items():
    7076        cc[k.replace('_', '-')] = v
    7177    cc = ', '.join([dictvalue(el) for el in cc.items()])
  • docs/topics/cache.txt

     
    10591059This decorator takes care of sending out the appropriate HTTP header behind the
    10601060scenes.
    10611061
     1062Note that the cache control settings "private" and "public" are mutually
     1063exclusive. The decorator ensures that the "public" directive is removed if
     1064"private" should be set (and vice versa). An example use of the two directives
     1065would be a blog site that offers both private and public entries. Public
     1066entries may be cached on any shared cache. The following code uses
     1067``patch_cache_control``, the manual way to modify the cache control header
     1068(it is internally called by the ``cache_control`` decorator)::
     1069
     1070    from django.views.decorators.cache import patch_cache_control
     1071    from django.views.decorators.vary import vary_on_cookie
     1072
     1073    @vary_on_cookie
     1074    def list_blog_entries_view(request):
     1075        if request.user.is_anonymous():
     1076            response = render_only_public_entries()
     1077            patch_cache_control(response, public=True)
     1078        else:
     1079            response = render_private_and_public_entries(request.user)
     1080            patch_cache_control(response, private=True)
     1081
     1082        return response
     1083
    10621084There are a few other ways to control cache parameters. For example, HTTP
    10631085allows applications to do the following:
    10641086
  • tests/regressiontests/cache/tests.py

     
    55
    66import hashlib
    77import os
     8import re
    89import tempfile
    910import time
    1011import warnings
     
    1920from django.test.utils import get_warnings_state, restore_warnings_state
    2021from django.utils import translation
    2122from django.utils import unittest
    22 from django.utils.cache import patch_vary_headers, get_cache_key, learn_cache_key
     23from django.utils.cache import patch_vary_headers, get_cache_key, learn_cache_key, patch_cache_control
    2324from django.views.decorators.cache import cache_page
    2425
    2526from regressiontests.cache.models import Poll, expensive_calculation
     
    998999        learn_cache_key(request, response)
    9991000        self.assertEqual(get_cache_key(request), 'views.decorators.cache.cache_page.settingsprefix.HEAD.a8c87a3d8c44853d7f79474f7ffe4ad5.d41d8cd98f00b204e9800998ecf8427e')
    10001001
     1002    def test_patch_cache_control(self):
     1003        tests = (
     1004            # Initial Cache-Control, kwargs to patch_cache_control, expected Cache-Control parts
     1005            (None, {'private' : True}, set(['private'])),
     1006
     1007            # Test whether private/public attributes are mutually exclusive
     1008            ('private', {'private' : True}, set(['private'])),
     1009            ('private', {'public' : True}, set(['public'])),
     1010            ('public', {'private' : True}, set(['private'])),
     1011            ('must-revalidate,max-age=60,private', {'public' : True}, set(['must-revalidate', 'max-age=60', 'public'])),
     1012            ('must-revalidate,max-age=60,public', {'private' : True}, set(['must-revalidate', 'max-age=60', 'private'])),
     1013
     1014            ('public', {'public' : True}, set(['public'])),
     1015            ('private', {'private' : True}, set(['private'])),
     1016
     1017            ('must-revalidate,max-age=60', {'public' : True}, set(['must-revalidate', 'max-age=60', 'public'])),
     1018        )
     1019
     1020        cc_delim_re = re.compile(r'\s*,\s*')
     1021
     1022        for initial_cc, newheaders, expected_cc in tests:
     1023            response = HttpResponse()
     1024            if initial_cc is not None:
     1025                response['Cache-Control'] = initial_cc
     1026            patch_cache_control(response, **newheaders)
     1027            parts = set(cc_delim_re.split(response['Cache-Control']))
     1028            self.assertEqual(parts, expected_cc)
     1029
    10011030class PrefixedCacheUtils(CacheUtils):
    10021031    def setUp(self):
    10031032        super(PrefixedCacheUtils, self).setUp()
Back to Top