Anonymous avatar Anonymous committed 3bf2b16

[1.2.X] Fixed #13686 -- Ensure that memcache handling of unicode values in add() and set_many() is consistent with the handling provided by get() and set(). Thanks to nedbatchelder for the report, and to jbalogh, accuser and Jacob Burch for their work ont the patch.

Backport of r15880 from trunk.

Comments (0)

Files changed (2)

django/core/cache/backends/memcached.py

         return timeout
 
     def add(self, key, value, timeout=0):
-        if isinstance(value, unicode):
-            value = value.encode('utf-8')
         return self._cache.add(smart_str(key), value, self._get_memcache_timeout(timeout))
 
     def get(self, key, default=None):
     def set_many(self, data, timeout=0):
         safe_data = {}
         for key, value in data.items():
-            if isinstance(value, unicode):
-                value = value.encode('utf-8')
             safe_data[smart_str(key)] = value
         self._cache.set_multi(safe_data, self._get_memcache_timeout(timeout))
 

tests/regressiontests/cache/tests.py

             u'Iñtërnâtiônàlizætiøn': u'Iñtërnâtiônàlizætiøn2',
             u'ascii': {u'x' : 1 }
             }
+        # Test `set`
         for (key, value) in stuff.items():
             self.cache.set(key, value)
             self.assertEqual(self.cache.get(key), value)
 
+        # Test `add`
+        for (key, value) in stuff.items():
+            self.cache.delete(key)
+            self.cache.add(key, value)
+            self.assertEqual(self.cache.get(key), value)
+
+        # Test `set_many`
+        for (key, value) in stuff.items():
+            self.cache.delete(key)
+        self.cache.set_many(stuff)
+        for (key, value) in stuff.items():
+            self.assertEqual(self.cache.get(key), value)
+
     def test_binary_string(self):
         # Binary strings should be cachable
         from zlib import compress, decompress
         value = 'value_to_be_compressed'
         compressed_value = compress(value)
+
+        # Test set
         self.cache.set('binary1', compressed_value)
         compressed_result = self.cache.get('binary1')
         self.assertEqual(compressed_value, compressed_result)
         self.assertEqual(value, decompress(compressed_result))
 
+        # Test add
+        self.cache.add('binary1-add', compressed_value)
+        compressed_result = self.cache.get('binary1-add')
+        self.assertEqual(compressed_value, compressed_result)
+        self.assertEqual(value, decompress(compressed_result))
+
+        # Test set_many
+        self.cache.set_many({'binary1-set_many': compressed_value})
+        compressed_result = self.cache.get('binary1-set_many')
+        self.assertEqual(compressed_value, compressed_result)
+        self.assertEqual(value, decompress(compressed_result))
+
     def test_set_many(self):
         # Multiple keys can be set using set_many
         self.cache.set_many({"key1": "spam", "key2": "eggs"})
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.