summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Barcenas <christian@cbarcenas.com>2018-07-06 11:03:58 -0700
committerTim Graham <timograham@gmail.com>2018-07-09 10:24:41 -0400
commitc9c6c166506bec59c57d4e3389e7ccd552e47ffc (patch)
tree468b7c9840f70cf359a6b9c9475217e0baef64cd
parent38e904e26576abffed3c257a1a741e1641c6f2de (diff)
Fixed #20584 -- Fixed memcached's get_many() with single-use iterators.
Thanks Guyon Morée for the report.
-rw-r--r--AUTHORS1
-rw-r--r--django/core/cache/backends/memcached.py9
-rw-r--r--tests/cache/tests.py1
3 files changed, 5 insertions, 6 deletions
diff --git a/AUTHORS b/AUTHORS
index 4ccdac886c..e5a22185a9 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -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>
diff --git a/django/core/cache/backends/memcached.py b/django/core/cache/backends/memcached.py
index 1c8066ba03..bb27cb53bb 100644
--- a/django/core/cache/backends/memcached.py
+++ b/django/core/cache/backends/memcached.py
@@ -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.
diff --git a/tests/cache/tests.py b/tests/cache/tests.py
index 9dd7fa78e0..542ac909ad 100644
--- a/tests/cache/tests.py
+++ b/tests/cache/tests.py
@@ -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