diff --git a/django/core/cache/backends/filebased.py b/django/core/cache/backends/filebased.py index bff912d85d..7c2c5c7edb 100644 --- a/django/core/cache/backends/filebased.py +++ b/django/core/cache/backends/filebased.py @@ -40,8 +40,8 @@ class FileBasedCache(BaseCache): if not self._is_expired(f): return pickle.loads(zlib.decompress(f.read())) except IOError as e: - if e.errno == errno.ENOENT: - pass # Cache file doesn't exist. + if e.errno != errno.ENOENT: + raise return default def set(self, key, value, timeout=DEFAULT_TIMEOUT, version=None): diff --git a/tests/cache/tests.py b/tests/cache/tests.py index 1e74df1e56..e2044bbdad 100644 --- a/tests/cache/tests.py +++ b/tests/cache/tests.py @@ -5,6 +5,7 @@ from __future__ import unicode_literals import copy +import io import os import re import shutil @@ -1261,6 +1262,17 @@ class FileBasedCacheTests(BaseCacheTests, TestCase): # This fails if not using the highest pickling protocol on Python 2. cache.set('unpicklable', UnpicklableType()) + def test_get_ignores_enoent(self): + cache.set('foo', 'bar') + os.unlink(cache._key_to_file('foo')) + # Returns the default instead of erroring. + self.assertEqual(cache.get('foo', 'baz'), 'baz') + + def test_get_does_not_ignore_non_enoent_errno_values(self): + with mock.patch.object(io, 'open', side_effect=IOError): + with self.assertRaises(IOError): + cache.get('foo') + @override_settings(CACHES={ 'default': {