Fixed #20584 -- Fixed memcached's get_many() with single-use iterators.

Thanks Guyon Morée for the report.
This commit is contained in:
Christian Barcenas 2018-07-06 11:03:58 -07:00 committed by Tim Graham
parent 38e904e265
commit c9c6c16650
3 changed files with 5 additions and 6 deletions

View File

@ -168,6 +168,7 @@ answer newbie questions, and generally made Django that much better:
Chris Jones <chris@brack3t.com>
Chris Lamb <chris@chris-lamb.co.uk>
Chris Streeter <chris@chrisstreeter.com>
Christian Barcenas <christian@cbarcenas.com>
Christian Metts
Christian Oudard <christian.oudard@gmail.com>
Christian Tanzer <tanzer@swing.co.at>

View File

@ -84,12 +84,9 @@ class BaseMemcachedCache(BaseCache):
self._cache.delete(key)
def get_many(self, keys, version=None):
new_keys = [self.make_key(x, version=version) for x in keys]
ret = self._cache.get_multi(new_keys)
if ret:
m = dict(zip(new_keys, keys))
return {m[k]: v for k, v in ret.items()}
return ret
key_map = {self.make_key(key, version=version): key for key in keys}
ret = self._cache.get_multi(key_map.keys())
return {key_map[k]: v for k, v in ret.items()}
def close(self, **kwargs):
# Many clients don't clean up connections properly.

View File

@ -312,6 +312,7 @@ class BaseCacheTests:
cache.set('d', 'd')
self.assertEqual(cache.get_many(['a', 'c', 'd']), {'a': 'a', 'c': 'c', 'd': 'd'})
self.assertEqual(cache.get_many(['a', 'b', 'e']), {'a': 'a', 'b': 'b'})
self.assertEqual(cache.get_many(iter(['a', 'b', 'e'])), {'a': 'a', 'b': 'b'})
def test_delete(self):
# Cache keys can be deleted