[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. git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@15881 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
9ccf1d087e
commit
52e81079be
4
django/core/cache/backends/memcached.py
vendored
4
django/core/cache/backends/memcached.py
vendored
@ -40,8 +40,6 @@ class CacheClass(BaseCache):
|
||||
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):
|
||||
@ -92,8 +90,6 @@ class CacheClass(BaseCache):
|
||||
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))
|
||||
|
||||
|
28
tests/regressiontests/cache/tests.py
vendored
28
tests/regressiontests/cache/tests.py
vendored
@ -293,20 +293,48 @@ class BaseCacheTests(object):
|
||||
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"})
|
||||
|
Loading…
x
Reference in New Issue
Block a user