|
1 "Memcached cache backend" |
|
2 |
|
3 from django.core.cache.backends.base import BaseCache, InvalidCacheBackendError |
|
4 from django.utils.encoding import smart_unicode, smart_str |
|
5 |
|
6 try: |
|
7 import cmemcache as memcache |
|
8 except ImportError: |
|
9 try: |
|
10 import memcache |
|
11 except: |
|
12 raise InvalidCacheBackendError("Memcached cache backend requires either the 'memcache' or 'cmemcache' library") |
|
13 |
|
14 class CacheClass(BaseCache): |
|
15 def __init__(self, server, params): |
|
16 BaseCache.__init__(self, params) |
|
17 self._cache = memcache.Client(server.split(';')) |
|
18 |
|
19 def add(self, key, value, timeout=0): |
|
20 self._cache.add(key.encode('ascii', 'ignore'), value, timeout or self.default_timeout) |
|
21 |
|
22 def get(self, key, default=None): |
|
23 val = self._cache.get(smart_str(key)) |
|
24 if val is None: |
|
25 return default |
|
26 else: |
|
27 if isinstance(val, basestring): |
|
28 return smart_unicode(val) |
|
29 else: |
|
30 return val |
|
31 |
|
32 def set(self, key, value, timeout=0): |
|
33 if isinstance(value, unicode): |
|
34 value = value.encode('utf-8') |
|
35 self._cache.set(smart_str(key), value, timeout or self.default_timeout) |
|
36 |
|
37 def delete(self, key): |
|
38 self._cache.delete(smart_str(key)) |
|
39 |
|
40 def get_many(self, keys): |
|
41 return self._cache.get_multi(map(smart_str,keys)) |