Skip to content

Commit 2679bc0

Browse files
committed
Fixed #4845 -- Fixed some problems with Unicode usage and caching. Thanks,
Jeremy Dunck. git-svn-id: http://code.djangoproject.com/svn/django/trunk@5718 bcc190cf-cafb-0310-a4f2-bffc1f526a37
1 parent 7aac81d commit 2679bc0

File tree

3 files changed

+36
-19
lines changed

3 files changed

+36
-19
lines changed

django/core/cache/backends/filebased.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
"File-based cache backend"
22

33
from django.core.cache.backends.simple import CacheClass as SimpleCacheClass
4-
import os, time, urllib
4+
from django.utils.http import urlquote_plus
5+
import os, time
56
try:
67
import cPickle as pickle
78
except ImportError:
@@ -77,4 +78,4 @@ def _createdir(self):
7778
raise EnvironmentError, "Cache directory '%s' does not exist and could not be created'" % self._dir
7879

7980
def _key_to_file(self, key):
80-
return os.path.join(self._dir, urllib.quote_plus(key))
81+
return os.path.join(self._dir, urlquote_plus(key))

django/core/cache/backends/memcached.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"Memcached cache backend"
22

33
from django.core.cache.backends.base import BaseCache, InvalidCacheBackendError
4+
from django.utils.encoding import smart_unicode, smart_str
45

56
try:
67
import cmemcache as memcache
@@ -16,17 +17,22 @@ def __init__(self, server, params):
1617
self._cache = memcache.Client(server.split(';'))
1718

1819
def get(self, key, default=None):
19-
val = self._cache.get(key)
20+
val = self._cache.get(smart_str(key))
2021
if val is None:
2122
return default
2223
else:
23-
return val
24+
if isinstance(val, basestring):
25+
return smart_unicode(val)
26+
else:
27+
return val
2428

2529
def set(self, key, value, timeout=0):
26-
self._cache.set(key, value, timeout or self.default_timeout)
30+
if isinstance(value, unicode):
31+
value = value.encode('utf-8')
32+
self._cache.set(smart_str(key), value, timeout or self.default_timeout)
2733

2834
def delete(self, key):
29-
self._cache.delete(key)
35+
self._cache.delete(smart_str(key))
3036

3137
def get_many(self, keys):
32-
return self._cache.get_multi(keys)
38+
return self._cache.get_multi(map(smart_str,keys))

tests/regressiontests/cache/tests.py

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# -*- coding: utf-8 -*-
2+
13
# Unit tests for cache framework
24
# Uses whatever cache backend is set in the test settings file.
35

@@ -19,8 +21,8 @@ def test_simple(self):
1921

2022
def test_non_existent(self):
2123
# get with non-existent keys
22-
self.assertEqual(cache.get("does not exist"), None)
23-
self.assertEqual(cache.get("does not exist", "bang!"), "bang!")
24+
self.assertEqual(cache.get("does_not_exist"), None)
25+
self.assertEqual(cache.get("does_not_exist", "bang!"), "bang!")
2426

2527
def test_get_many(self):
2628
# get_many
@@ -42,14 +44,14 @@ def test_delete(self):
4244

4345
def test_has_key(self):
4446
# has_key
45-
cache.set("hello", "goodbye")
46-
self.assertEqual(cache.has_key("hello"), True)
47-
self.assertEqual(cache.has_key("goodbye"), False)
47+
cache.set("hello1", "goodbye1")
48+
self.assertEqual(cache.has_key("hello1"), True)
49+
self.assertEqual(cache.has_key("goodbye1"), False)
4850

4951
def test_in(self):
50-
cache.set("hello", "goodbye")
51-
self.assertEqual("hello" in cache, True)
52-
self.assertEqual("goodbye" in cache, False)
52+
cache.set("hello2", "goodbye2")
53+
self.assertEqual("hello2" in cache, True)
54+
self.assertEqual("goodbye2" in cache, False)
5355

5456
def test_data_types(self):
5557
stuff = {
@@ -61,15 +63,23 @@ def test_data_types(self):
6163
'function' : f,
6264
'class' : C,
6365
}
64-
for (key, value) in stuff.items():
65-
cache.set(key, value)
66-
self.assertEqual(cache.get(key), value)
6766

6867
def test_expiration(self):
6968
# expiration
7069
cache.set('expire', 'very quickly', 1)
7170
time.sleep(2)
7271
self.assertEqual(cache.get("expire"), None)
7372

73+
def test_unicode(self):
74+
stuff = {
75+
u'ascii': u'ascii_value',
76+
u'unicode_ascii': u'Iñtërnâtiônàlizætiøn1',
77+
u'Iñtërnâtiônàlizætiøn': u'Iñtërnâtiônàlizætiøn2',
78+
u'ascii': {u'x' : 1 }
79+
}
80+
for (key, value) in stuff.items():
81+
cache.set(key, value)
82+
self.assertEqual(cache.get(key), value)
83+
7484
if __name__ == '__main__':
75-
unittest.main()
85+
unittest.main()

0 commit comments

Comments
 (0)