Commit 45baaaba authored by Claude Paroz's avatar Claude Paroz
Browse files

[py3] Fixed encoding issues in cache key generation

parent d774ad75
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
"Base Cache class."
from __future__ import unicode_literals

import warnings

from django.core.exceptions import ImproperlyConfigured, DjangoRuntimeWarning
from django.utils.encoding import smart_bytes
from django.utils.importlib import import_module

class InvalidCacheBackendError(ImproperlyConfigured):
@@ -23,7 +23,7 @@ def default_key_func(key, key_prefix, version):
    the `key_prefix'. KEY_FUNCTION can be used to specify an alternate
    function with custom key making behavior.
    """
    return ':'.join([key_prefix, str(version), smart_bytes(key)])
    return ':'.join([key_prefix, str(version), key])

def get_key_func(key_func):
    """
@@ -62,7 +62,7 @@ class BaseCache(object):
        except (ValueError, TypeError):
            self._cull_frequency = 3

        self.key_prefix = smart_bytes(params.get('KEY_PREFIX', ''))
        self.key_prefix = params.get('KEY_PREFIX', '')
        self.version = params.get('VERSION', 1)
        self.key_func = get_key_func(params.get('KEY_FUNCTION', None))

+2 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ cache keys to prevent delivery of wrong content.
An example: i18n middleware would need to distinguish caches by the
"Accept-language" header.
"""
from __future__ import unicode_literals

import hashlib
import re
@@ -170,7 +171,7 @@ def _i18n_cache_key_suffix(request, cache_key):
        # User-defined tzinfo classes may return absolutely anything.
        # Hence this paranoid conversion to create a valid cache key.
        tz_name = force_text(get_current_timezone_name(), errors='ignore')
        cache_key += '.%s' % tz_name.encode('ascii', 'ignore').replace(' ', '_')
        cache_key += '.%s' % tz_name.encode('ascii', 'ignore').decode('ascii').replace(' ', '_')
    return cache_key

def _generate_cache_key(request, method, headerlist, key_prefix):
+2 −2
Original line number Diff line number Diff line
@@ -1308,7 +1308,7 @@ class CacheI18nTest(TestCase):
        # This is tightly coupled to the implementation,
        # but it's the most straightforward way to test the key.
        tz = force_text(timezone.get_current_timezone_name(), errors='ignore')
        tz = tz.encode('ascii', 'ignore').replace(' ', '_')
        tz = tz.encode('ascii', 'ignore').decode('ascii').replace(' ', '_')
        response = HttpResponse()
        key = learn_cache_key(request, response)
        self.assertIn(tz, key, "Cache keys should include the time zone name when time zones are active")
@@ -1320,7 +1320,7 @@ class CacheI18nTest(TestCase):
        request = self._get_request()
        lang = translation.get_language()
        tz = force_text(timezone.get_current_timezone_name(), errors='ignore')
        tz = tz.encode('ascii', 'ignore').replace(' ', '_')
        tz = tz.encode('ascii', 'ignore').decode('ascii').replace(' ', '_')
        response = HttpResponse()
        key = learn_cache_key(request, response)
        self.assertNotIn(lang, key, "Cache keys shouldn't include the language name when i18n isn't active")