Ticket #5691: 5691.2.patch

File 5691.2.patch, 7.3 KB (added by aaloy, 6 years ago)

Patch documentation

  • django/utils/cache.py

     
    2929from django.utils.encoding import smart_str, iri_to_uri
    3030from django.utils.http import http_date
    3131from django.utils.hashcompat import md5_constructor
     32from django.utils import translation
    3233from django.http import HttpRequest
    3334
    3435cc_delim_re = re.compile(r'\s*,\s*')
     
    145146        if value is not None:
    146147            ctx.update(value)
    147148    path = md5_constructor(iri_to_uri(request.path))
    148     return 'views.decorators.cache.cache_page.%s.%s.%s' % (
    149                key_prefix, path.hexdigest(), ctx.hexdigest())
     149    cache_key = 'views.decorators.cache.cache_page.%s.%s.%s' % (
     150        key_prefix, path.hexdigest(), ctx.hexdigest())
     151    if settings.USE_I18N:
     152        cache_key += ".%s" % translation.get_language()
     153    return cache_key
    150154
    151155def _generate_cache_header_key(key_prefix, request):
    152156    """Returns a cache key for the header cache."""
     
    166170    if key_prefix is None:
    167171        key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
    168172    cache_key = _generate_cache_header_key(key_prefix, request)
     173    if settings.USE_I18N:
     174        cache_key += ".%s" % translation.get_language()
    169175    headerlist = cache.get(cache_key, None)
    170176    if headerlist is not None:
    171177        return _generate_cache_key(request, headerlist, key_prefix)
     
    190196    if cache_timeout is None:
    191197        cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS
    192198    cache_key = _generate_cache_header_key(key_prefix, request)
     199    if settings.USE_I18N:
     200        cache_key += ".%s" % translation.get_language()
    193201    if response.has_header('Vary'):
    194202        headerlist = ['HTTP_'+header.upper().replace('-', '_')
    195203                      for header in cc_delim_re.split(response['Vary'])]
  • tests/regressiontests/cache/tests.py

     
    1414from django.core.cache import get_cache
    1515from django.core.cache.backends.base import InvalidCacheBackendError
    1616from django.http import HttpResponse, HttpRequest
     17from django.middleware.cache import FetchFromCacheMiddleware, UpdateCacheMiddleware
     18from django.utils import translation
    1719from django.utils.cache import patch_vary_headers, get_cache_key, learn_cache_key
    1820from django.utils.hashcompat import md5_constructor
    1921from regressiontests.cache.models import Poll, expensive_calculation
     
    458460        learn_cache_key(request, response)
    459461        self.assertEqual(get_cache_key(request), 'views.decorators.cache.cache_page.settingsprefix.a8c87a3d8c44853d7f79474f7ffe4ad5.d41d8cd98f00b204e9800998ecf8427e')
    460462
     463class CacheI18nTest(unittest.TestCase):
     464    def setUp(self): 
     465        self.orig_cache_middleware_seconds = settings.CACHE_MIDDLEWARE_SECONDS
     466        self.orig_cache_middleware_key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
     467        self.orig_cache_backend = settings.CACHE_BACKEND
     468        self.orig_use_i18n = settings.USE_I18N
     469        self.orig_languages =  settings.LANGUAGES
     470 
     471        settings.LANGUAGES = (
     472                ('en', 'English'),
     473                ('es', 'Spanish'),
     474        )
     475        self.path = '/cache/test/'
     476        settings.CACHE_MIDDLEWARE_KEY_PREFIX = 'settingsprefix'
     477        settings.CACHE_MIDDLEWARE_SECONDS
     478        self.path = '/cache/test/'
     479       
     480 
     481    def tearDown(self):
     482        settings.CACHE_MIDDLEWARE_SECONDS = self.orig_cache_middleware_seconds
     483        settings.CACHE_MIDDLEWARE_KEY_PREFIX = self.orig_cache_middleware_key_prefix
     484        settings.CACHE_BACKEND = self.orig_cache_backend
     485        settings.USE_I18N = self.orig_use_i18n
     486        settings.LANGUAGES = self.orig_languages
     487        translation.deactivate()
     488 
     489    def _get_request(self):
     490        request = HttpRequest()
     491        request.META = {
     492            'SERVER_NAME': 'testserver',
     493            'SERVER_PORT': 80,
     494        }
     495        request.path = request.path_info = self.path
     496        return request
     497 
     498    def _get_request_cache(self):
     499        request = HttpRequest()
     500        request.META = {
     501            'SERVER_NAME': 'testserver',
     502            'SERVER_PORT': 80,
     503        }
     504        request.path = request.path_info = self.path
     505        request._cache_update_cache = True
     506        request.method = 'GET'
     507        request.session = {}
     508        return request
     509 
     510    def test_cache_key_i18n(self):
     511        settings.USE_I18N = True
     512        request = self._get_request()
     513        lang = translation.get_language()
     514        response = HttpResponse()
     515        key = learn_cache_key(request, response)
     516        self.assertTrue(key.endswith(lang), "Cache keys should include the language name when i18n is active")
     517        key2 = get_cache_key(request)
     518        self.assertEqual(key, key2)
     519 
     520    def test_cache_key_no_i18n (self):
     521        settings.USE_I18N = False
     522        request = self._get_request()
     523        lang = translation.get_language()
     524        response = HttpResponse()
     525        key = learn_cache_key(request, response)
     526        self.assertFalse(key.endswith(lang), "Cache keys shouldn't include the language name when i18n is inactive")
     527 
     528    def test_middleware(self):
     529 
     530        def set_cache(request, lang, msg):
     531            translation.activate(lang)
     532            response = HttpResponse()
     533            response.content= msg
     534            return UpdateCacheMiddleware().process_response(request, response)
     535 
     536        settings.CACHE_MIDDLEWARE_SECONDS = 60
     537        settings.CACHE_MIDDLEWARE_KEY_PREFIX="test"
     538        settings.CACHE_BACKEND='locmem:///'
     539        settings.USE_I18N = True
     540        en_message ="Hello world!"
     541        es_message ="Hola mundo!"
     542 
     543        request = self._get_request_cache()
     544        set_cache(request, 'en', en_message)
     545        get_cache_data = FetchFromCacheMiddleware().process_request(request)
     546        # Check that we can recover the cache
     547        self.assertNotEqual(get_cache_data.content, None)
     548        self.assertEqual(en_message, get_cache_data.content)
     549        # change the session language and set content
     550        request = self._get_request_cache()
     551        set_cache(request, 'es', es_message)
     552        # change again the language
     553        translation.activate('en')
     554        # retrieve the content from cache
     555        get_cache_data = FetchFromCacheMiddleware().process_request(request)
     556        self.assertEqual(get_cache_data.content, en_message)
     557        # change again the language
     558        translation.activate('es')
     559        get_cache_data = FetchFromCacheMiddleware().process_request(request)
     560        self.assertEqual(get_cache_data.content, es_message)
     561
    461562if __name__ == '__main__':
    462563    unittest.main()
  • docs/topics/cache.txt

     
    320320the ``never_cache`` decorator). See the `using other headers`__ section for
    321321more on these decorators.
    322322
     323.. versionadded:: 1.2
     324
     325If USE_I18N is set to True the generated cache key would include the language name.
     326
    323327__ `Controlling cache: Using other headers`_
    324328
    325329The per-view cache
Back to Top