Ticket #15499: allow-cache-control-private-override-3.diff
File allow-cache-control-private-override-3.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
1062 1062 This decorator takes care of sending out the appropriate HTTP header behind the 1063 1063 scenes. 1064 1064 1065 Note that the cache control settings "private" and "public" are mutually 1066 exclusive. The decorator ensures that the "public" directive is removed if 1067 "private" should be set (and vice versa). An example use of the two directives 1068 would be a blog site that offers both private and public entries. Public 1069 entries may be cached on any shared cache. The following code uses 1070 ``patch_cache_control``, the manual way to modify the cache control header 1071 (it is internally called by the ``cache_control`` decorator):: 1072 1073 from django.views.decorators.cache import patch_cache_control 1074 from django.views.decorators.vary import vary_on_cookie 1075 1076 @vary_on_cookie 1077 def list_blog_entries_view(request): 1078 if request.user.is_anonymous(): 1079 response = render_only_public_entries() 1080 patch_cache_control(response, public=True) 1081 else: 1082 response = render_private_and_public_entries(request.user) 1083 patch_cache_control(response, private=True) 1084 1085 return response 1086 1065 1087 There are a few other ways to control cache parameters. For example, HTTP 1066 1088 allows applications to do the following: 1067 1089 -
tests/regressiontests/cache/tests.py
5 5 6 6 import hashlib 7 7 import os 8 import re 8 9 import tempfile 9 10 import time 10 11 import warnings … … 19 20 from django.test.utils import get_warnings_state, restore_warnings_state 20 21 from django.utils import translation 21 22 from django.utils import unittest 22 from django.utils.cache import patch_vary_headers, get_cache_key, learn_cache_key 23 from django.utils.cache import patch_vary_headers, get_cache_key, learn_cache_key, patch_cache_control 23 24 from django.views.decorators.cache import cache_page 24 25 25 26 from regressiontests.cache.models import Poll, expensive_calculation … … 980 981 learn_cache_key(request, response) 981 982 self.assertEqual(get_cache_key(request), 'views.decorators.cache.cache_page.settingsprefix.HEAD.a8c87a3d8c44853d7f79474f7ffe4ad5.d41d8cd98f00b204e9800998ecf8427e') 982 983 984 def test_patch_cache_control(self): 985 tests = ( 986 # Initial Cache-Control, kwargs to patch_cache_control, expected Cache-Control parts 987 (None, {"private" : True}, set(['private'])), 988 989 # Test whether private/public attributes are mutually exclusive 990 ('private', {"private" : True}, set(['private'])), 991 ('private', {"public" : True}, set(['public'])), 992 ('public', {"private" : True}, set(['private'])), 993 ('must-revalidate,max-age=60,private', {"public" : True}, set(['must-revalidate', 'max-age=60', 'public'])), 994 ('must-revalidate,max-age=60,public', {"private" : True}, set(['must-revalidate', 'max-age=60', 'private'])), 995 996 ('public', {"public" : True}, set(['public'])), 997 ('private', {"private" : True}, set(['private'])), 998 999 ('must-revalidate,max-age=60', {"public" : True}, set(['must-revalidate', 'max-age=60', 'public'])), 1000 ) 1001 1002 cc_delim_re = re.compile(r'\s*,\s*') 1003 1004 for initial_cc, newheaders, expected_cc in tests: 1005 response = HttpResponse() 1006 if initial_cc is not None: 1007 response['Cache-Control'] = initial_cc 1008 patch_cache_control(response, **newheaders) 1009 parts = set(cc_delim_re.split(response['Cache-Control'])) 1010 self.assertEqual(parts, expected_cc) 1011 983 1012 class PrefixedCacheUtils(CacheUtils): 984 1013 def setUp(self): 985 1014 super(PrefixedCacheUtils, self).setUp()