Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed #3012 -- Changed the locmem cache backend to use pickle instead…

… of deepcopy to make it compatible with iterators (which cannot be copied). Patch from Sundance.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@5703 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit ae7f04caab1b4f2a2b509b036499e4e042caaac6 1 parent 208352e
@gdub gdub authored
View
1  AUTHORS
@@ -237,6 +237,7 @@ answer newbie questions, and generally made Django that much better:
Vasiliy Stavenko <stavenko@gmail.com>
Thomas Steinacher <http://www.eggdrop.ch/>
nowell strite
+ Sundance
Radek Švarz <http://www.svarz.cz/translate/>
Swaroop C H <http://www.swaroopch.info>
Aaron Swartz <http://www.aaronsw.com/>
View
16 django/core/cache/backends/locmem.py
@@ -2,7 +2,11 @@
from django.core.cache.backends.simple import CacheClass as SimpleCacheClass
from django.utils.synch import RWLock
-import copy, time
+import time
+try:
+ import cPickle as pickle
+except ImportError:
+ import pickle
class CacheClass(SimpleCacheClass):
def __init__(self, host, params):
@@ -20,7 +24,10 @@ def get(self, key, default=None):
elif exp < now:
should_delete = True
else:
- return copy.deepcopy(self._cache[key])
+ try:
+ return pickle.loads(self._cache[key])
+ except pickle.PickleError:
+ return default
finally:
self._lock.reader_leaves()
if should_delete:
@@ -35,7 +42,10 @@ def get(self, key, default=None):
def set(self, key, value, timeout=None):
self._lock.writer_enters()
try:
- SimpleCacheClass.set(self, key, value, timeout)
+ try:
+ super(CacheClass, self).set(key, pickle.dumps(value), timeout)
+ except pickle.PickleError:
+ pass
finally:
self._lock.writer_leaves()
View
14 tests/regressiontests/cache/tests.py
@@ -4,7 +4,7 @@
from django.core.cache import cache
import time, unittest
-# functions/classes for complex data type tests
+# functions/classes for complex data type tests
def f():
return 42
class C:
@@ -46,13 +46,12 @@ def test_has_key(self):
self.assertEqual(cache.has_key("hello"), True)
self.assertEqual(cache.has_key("goodbye"), False)
- def test_in(self):
- cache.set("hello", "goodbye")
- self.assertEqual("hello" in cache, True)
- self.assertEqual("goodbye" in cache, False)
+ def test_in(self):
+ cache.set("hello", "goodbye")
+ self.assertEqual("hello" in cache, True)
+ self.assertEqual("goodbye" in cache, False)
def test_data_types(self):
- # test data types
stuff = {
'string' : 'this is a string',
'int' : 42,
@@ -61,11 +60,12 @@ def test_data_types(self):
'dict' : {'A': 1, 'B' : 2},
'function' : f,
'class' : C,
+ 'iter' : iter([1, 2 ,3]),
}
for (key, value) in stuff.items():
cache.set(key, value)
self.assertEqual(cache.get(key), value)
-
+
def test_expiration(self):
# expiration
cache.set('expire', 'very quickly', 1)
Please sign in to comment.
Something went wrong with that request. Please try again.