Fixed #25501 -- Made the file-based cache backend use the highest pickling protocol.
This commit is contained in:
parent
9e3f6c7483
commit
48888a1a67
|
@ -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:
|
||||
|
|
|
@ -106,7 +106,7 @@ Minor features
|
|||
Cache
|
||||
^^^^^
|
||||
|
||||
* ...
|
||||
* The file-based cache backend now uses the highest pickling protocol.
|
||||
|
||||
CSRF
|
||||
^^^^
|
||||
|
|
|
@ -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': {
|
||||
|
|
Loading…
Reference in New Issue