1 | "Memcached cache backend" |
---|
2 | |
---|
3 | from django.core.cache.backends.base import BaseCache, InvalidCacheBackendError |
---|
4 | |
---|
5 | try: |
---|
6 | import memcache |
---|
7 | except ImportError: |
---|
8 | raise InvalidCacheBackendError, "Memcached cache backend requires the 'memcache' library" |
---|
9 | |
---|
10 | # |
---|
11 | # The memcache module refuses to use keys longer than 250 characters or containing |
---|
12 | # "control characters", which it defines as anything with a decimal ASCII code below |
---|
13 | # 33. This definition includes the non-printable ASCII characters and the space character, |
---|
14 | # so to allow caching of very long URLs or URLs containing spaces we'll hash them. |
---|
15 | # |
---|
16 | try: |
---|
17 | import hashlib |
---|
18 | key_hasher = hashlib.sha1 |
---|
19 | except ImportError: |
---|
20 | import sha |
---|
21 | key_hasher = sha.new |
---|
22 | |
---|
23 | class CacheClass(BaseCache): |
---|
24 | def __init__(self, server, params): |
---|
25 | BaseCache.__init__(self, params) |
---|
26 | self._cache = memcache.Client(server.split(';')) |
---|
27 | |
---|
28 | def hash_key(self, key): |
---|
29 | if ' ' not in key and len(key) < memcache.SERVER_MAX_KEY_LENGTH: |
---|
30 | return key |
---|
31 | |
---|
32 | key_hash = key_hasher() |
---|
33 | key_hash.update(key) |
---|
34 | return key_hash.hexdigest() |
---|
35 | |
---|
36 | def get(self, key, default=None): |
---|
37 | val = self._cache.get(self.hash_key(key)) |
---|
38 | if val is None: |
---|
39 | return default |
---|
40 | else: |
---|
41 | return val |
---|
42 | |
---|
43 | def set(self, key, value, timeout=0): |
---|
44 | self._cache.set(self.hash_key(key), value, timeout or self.default_timeout) |
---|
45 | |
---|
46 | def delete(self, key): |
---|
47 | self._cache.delete(self.hash_key(key)) |
---|
48 | |
---|
49 | def get_many(self, keys): |
---|
50 | keys = [self.hash_key(key) for key in keys] |
---|
51 | return self._cache.get_multi(keys) |
---|