瀏覽代碼

Fixed #26792 -- Allowed None for the value of cache.get_or_set().

Dmitry S..ky / skype: dvska-at-skype 8 年之前
父節點
當前提交
82be474efa
共有 2 個文件被更改,包括 13 次插入6 次删除
  1. 2 4
      django/core/cache/backends/base.py
  2. 11 2
      tests/cache/tests.py

+ 2 - 4
django/core/cache/backends/base.py

@@ -147,7 +147,7 @@ class BaseCache(object):
                 d[k] = val
         return d
 
-    def get_or_set(self, key, default=None, timeout=DEFAULT_TIMEOUT, version=None):
+    def get_or_set(self, key, default, timeout=DEFAULT_TIMEOUT, version=None):
         """
         Fetch a given key from the cache. If the key does not exist,
         the key is added and set to the default value. The default value can
@@ -156,10 +156,8 @@ class BaseCache(object):
 
         Return the value of the key stored or retrieved.
         """
-        if default is None:
-            raise ValueError('You need to specify a value.')
         val = self.get(key, version=version)
-        if val is None:
+        if val is None and default is not None:
             if callable(default):
                 default = default()
             self.add(key, default, timeout=timeout, version=version)

+ 11 - 2
tests/cache/tests.py

@@ -213,12 +213,14 @@ class DummyCacheTests(SimpleTestCase):
 
     def test_get_or_set(self):
         self.assertEqual(cache.get_or_set('mykey', 'default'), 'default')
+        self.assertEqual(cache.get_or_set('mykey', None), None)
 
     def test_get_or_set_callable(self):
         def my_callable():
             return 'default'
 
         self.assertEqual(cache.get_or_set('mykey', my_callable), 'default')
+        self.assertEqual(cache.get_or_set('mykey', my_callable()), 'default')
 
 
 def custom_key_func(key, key_prefix, version):
@@ -918,18 +920,25 @@ class BaseCacheTests(object):
         self.assertIsNone(cache.get('projector'))
         self.assertEqual(cache.get_or_set('projector', 42), 42)
         self.assertEqual(cache.get('projector'), 42)
+        self.assertEqual(cache.get_or_set('null', None), None)
 
     def test_get_or_set_callable(self):
         def my_callable():
             return 'value'
 
         self.assertEqual(cache.get_or_set('mykey', my_callable), 'value')
+        self.assertEqual(cache.get_or_set('mykey', my_callable()), 'value')
 
     def test_get_or_set_version(self):
+        msg = (
+            "get_or_set() missing 1 required positional argument: 'default'"
+            if six.PY3
+            else 'get_or_set() takes at least 3 arguments'
+        )
         cache.get_or_set('brian', 1979, version=2)
-        with self.assertRaisesMessage(ValueError, 'You need to specify a value.'):
+        with self.assertRaisesMessage(TypeError, msg):
             cache.get_or_set('brian')
-        with self.assertRaisesMessage(ValueError, 'You need to specify a value.'):
+        with self.assertRaisesMessage(TypeError, msg):
             cache.get_or_set('brian', version=1)
         self.assertIsNone(cache.get('brian', version=1))
         self.assertEqual(cache.get_or_set('brian', 42, version=1), 42)