Fixed #25501 -- Made the file-based cache backend use the highest pickling protocol.

This commit is contained in:
Andrew Artajos 2015-10-08 17:05:01 +11:00 committed by Tim Graham
parent 9e3f6c7483
commit 48888a1a67
3 changed files with 12 additions and 3 deletions

View File

@ -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:

View File

@ -106,7 +106,7 @@ Minor features
Cache
^^^^^
* ...
* The file-based cache backend now uses the highest pickling protocol.
CSRF
^^^^

View File

@ -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': {