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:
|
try:
|
||||||
with io.open(fd, 'wb') as f:
|
with io.open(fd, 'wb') as f:
|
||||||
expiry = self.get_backend_timeout(timeout)
|
expiry = self.get_backend_timeout(timeout)
|
||||||
f.write(pickle.dumps(expiry, -1))
|
f.write(pickle.dumps(expiry, pickle.HIGHEST_PROTOCOL))
|
||||||
f.write(zlib.compress(pickle.dumps(value), -1))
|
f.write(zlib.compress(pickle.dumps(value, pickle.HIGHEST_PROTOCOL), -1))
|
||||||
file_move_safe(tmp_path, fname, allow_overwrite=True)
|
file_move_safe(tmp_path, fname, allow_overwrite=True)
|
||||||
renamed = True
|
renamed = True
|
||||||
finally:
|
finally:
|
||||||
|
|
|
@ -106,7 +106,7 @@ Minor features
|
||||||
Cache
|
Cache
|
||||||
^^^^^
|
^^^^^
|
||||||
|
|
||||||
* ...
|
* The file-based cache backend now uses the highest pickling protocol.
|
||||||
|
|
||||||
CSRF
|
CSRF
|
||||||
^^^^
|
^^^^
|
||||||
|
|
|
@ -65,6 +65,11 @@ class Unpickable(object):
|
||||||
raise pickle.PickleError()
|
raise pickle.PickleError()
|
||||||
|
|
||||||
|
|
||||||
|
class UnpicklableType(object):
|
||||||
|
# Unpicklable using the default pickling protocol on Python 2.
|
||||||
|
__slots__ = 'a',
|
||||||
|
|
||||||
|
|
||||||
@override_settings(CACHES={
|
@override_settings(CACHES={
|
||||||
'default': {
|
'default': {
|
||||||
'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
|
'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
|
||||||
|
@ -1221,6 +1226,10 @@ class FileBasedCacheTests(BaseCacheTests, TestCase):
|
||||||
cache.set('foo', 'bar')
|
cache.set('foo', 'bar')
|
||||||
os.path.exists(self.dirname)
|
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={
|
@override_settings(CACHES={
|
||||||
'default': {
|
'default': {
|
||||||
|
|
Loading…
Reference in New Issue