Ticket #15499: allow-cache-control-private-override-2.diff
File allow-cache-control-private-override-2.diff, 4.6 KB (added by , 14 years ago) |
---|
-
django/utils/cache.py
67 67 if 'max-age' in cc and 'max_age' in kwargs: 68 68 kwargs['max_age'] = min(cc['max-age'], kwargs['max_age']) 69 69 70 # Allow overriding private caching and vice versa 71 if 'private' in cc and 'public' in kwargs: 72 del cc['private'] 73 elif 'public' in cc and 'private' in kwargs: 74 del cc['public'] 75 70 76 for (k, v) in kwargs.items(): 71 77 cc[k.replace('_', '-')] = v 72 78 cc = ', '.join([dictvalue(el) for el in cc.items()]) -
docs/topics/cache.txt
1058 1058 This decorator takes care of sending out the appropriate HTTP header behind the 1059 1059 scenes. 1060 1060 1061 Note that the cache control settings "private" and "public" are mutually 1062 exclusive. The decorator ensures that the "public" directive is removed if 1063 "private" should be set (and vice versa). An example use of the two directives 1064 would be a blog site that offers both private and public entries. Public 1065 entries may be cached on any shared cache. The following code uses 1066 ``patch_cache_control``, the manual way to modify the cache control header 1067 (it is internally called by the ``cache_control`` decorator):: 1068 1069 from django.views.decorators.cache import patch_cache_control 1070 from django.views.decorators.vary import vary_on_cookie 1071 1072 @vary_on_cookie 1073 def list_blog_entries_view(request): 1074 if request.user.is_anonymous(): 1075 response = render_only_public_entries() 1076 patch_cache_control(response, public=True) 1077 else: 1078 response = render_private_and_public_entries(request.user) 1079 patch_cache_control(response, private=True) 1080 1081 return response 1082 1061 1083 There are a few other ways to control cache parameters. For example, HTTP 1062 1084 allows applications to do the following: 1063 1085 -
tests/regressiontests/cache/tests.py
4 4 # Uses whatever cache backend is set in the test settings file. 5 5 6 6 import os 7 import re 7 8 import tempfile 8 9 import time 9 10 import warnings … … 18 19 from django.test.utils import get_warnings_state, restore_warnings_state 19 20 from django.utils import translation 20 21 from django.utils import unittest 21 from django.utils.cache import patch_vary_headers, get_cache_key, learn_cache_key 22 from django.utils.cache import patch_vary_headers, get_cache_key, learn_cache_key, patch_cache_control 22 23 from django.utils.hashcompat import md5_constructor 23 24 from django.views.decorators.cache import cache_page 24 25 … … 932 933 learn_cache_key(request, response) 933 934 self.assertEqual(get_cache_key(request), 'views.decorators.cache.cache_page.settingsprefix.HEAD.a8c87a3d8c44853d7f79474f7ffe4ad5.d41d8cd98f00b204e9800998ecf8427e') 934 935 936 def test_patch_cache_control(self): 937 tests = ( 938 # Initial Cache-Control, kwargs to patch_cache_control, expected Cache-Control parts 939 (None, {"private" : True}, set(['private'])), 940 941 # Test whether private/public attributes are mutually exclusive 942 ('private', {"private" : True}, set(['private'])), 943 ('private', {"public" : True}, set(['public'])), 944 ('public', {"private" : True}, set(['private'])), 945 ('must-revalidate,max-age=60,private', {"public" : True}, set(['must-revalidate', 'max-age=60', 'public'])), 946 ('must-revalidate,max-age=60,public', {"private" : True}, set(['must-revalidate', 'max-age=60', 'private'])), 947 948 ('public', {"public" : True}, set(['public'])), 949 ('private', {"private" : True}, set(['private'])), 950 951 ('must-revalidate,max-age=60', {"public" : True}, set(['must-revalidate', 'max-age=60', 'public'])), 952 ) 953 954 cc_delim_re = re.compile(r'\s*,\s*') 955 956 for initial_cc, newheaders, expected_cc in tests: 957 response = HttpResponse() 958 if initial_cc is not None: 959 response['Cache-Control'] = initial_cc 960 patch_cache_control(response, **newheaders) 961 parts = set(cc_delim_re.split(response['Cache-Control'])) 962 self.assertEqual(parts, expected_cc) 963 935 964 class PrefixedCacheUtils(CacheUtils): 936 965 def setUp(self): 937 966 super(PrefixedCacheUtils, self).setUp()