From 48888a1a67db0404e5a31c9ca0349984e496f26f Mon Sep 17 00:00:00 2001 From: Andrew Artajos Date: Thu, 8 Oct 2015 17:05:01 +1100 Subject: [PATCH] Fixed #25501 -- Made the file-based cache backend use the highest pickling protocol. --- django/core/cache/backends/filebased.py | 4 ++-- docs/releases/1.10.txt | 2 +- tests/cache/tests.py | 9 +++++++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/django/core/cache/backends/filebased.py b/django/core/cache/backends/filebased.py index c35efce92c..88a8b528b5 100644 --- a/django/core/cache/backends/filebased.py +++ b/django/core/cache/backends/filebased.py @@ -54,8 +54,8 @@ class FileBasedCache(BaseCache): try: with io.open(fd, 'wb') as f: expiry = self.get_backend_timeout(timeout) - f.write(pickle.dumps(expiry, -1)) - f.write(zlib.compress(pickle.dumps(value), -1)) + f.write(pickle.dumps(expiry, pickle.HIGHEST_PROTOCOL)) + f.write(zlib.compress(pickle.dumps(value, pickle.HIGHEST_PROTOCOL), -1)) file_move_safe(tmp_path, fname, allow_overwrite=True) renamed = True finally: diff --git a/docs/releases/1.10.txt b/docs/releases/1.10.txt index 1087c0bb55..46cc18f467 100644 --- a/docs/releases/1.10.txt +++ b/docs/releases/1.10.txt @@ -106,7 +106,7 @@ Minor features Cache ^^^^^ -* ... +* The file-based cache backend now uses the highest pickling protocol. CSRF ^^^^ diff --git a/tests/cache/tests.py b/tests/cache/tests.py index dca08ee081..e77cec9151 100644 --- a/tests/cache/tests.py +++ b/tests/cache/tests.py @@ -65,6 +65,11 @@ class Unpickable(object): raise pickle.PickleError() +class UnpicklableType(object): + # Unpicklable using the default pickling protocol on Python 2. + __slots__ = 'a', + + @override_settings(CACHES={ 'default': { 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', @@ -1221,6 +1226,10 @@ class FileBasedCacheTests(BaseCacheTests, TestCase): cache.set('foo', 'bar') os.path.exists(self.dirname) + def test_cache_write_unpickable_type(self): + # This fails if not using the highest pickling protocol on Python 2. + cache.set('unpickable', UnpicklableType()) + @override_settings(CACHES={ 'default': {