|
1 "Base Cache class." |
|
2 |
|
3 from django.core.exceptions import ImproperlyConfigured |
|
4 |
|
5 class InvalidCacheBackendError(ImproperlyConfigured): |
|
6 pass |
|
7 |
|
8 class BaseCache(object): |
|
9 def __init__(self, params): |
|
10 timeout = params.get('timeout', 300) |
|
11 try: |
|
12 timeout = int(timeout) |
|
13 except (ValueError, TypeError): |
|
14 timeout = 300 |
|
15 self.default_timeout = timeout |
|
16 |
|
17 def add(self, key, value, timeout=None): |
|
18 """ |
|
19 Set a value in the cache if the key does not already exist. If |
|
20 timeout is given, that timeout will be used for the key; otherwise |
|
21 the default cache timeout will be used. |
|
22 |
|
23 Returns True if the value was stored, False otherwise. |
|
24 """ |
|
25 raise NotImplementedError |
|
26 |
|
27 def get(self, key, default=None): |
|
28 """ |
|
29 Fetch a given key from the cache. If the key does not exist, return |
|
30 default, which itself defaults to None. |
|
31 """ |
|
32 raise NotImplementedError |
|
33 |
|
34 def set(self, key, value, timeout=None): |
|
35 """ |
|
36 Set a value in the cache. If timeout is given, that timeout will be |
|
37 used for the key; otherwise the default cache timeout will be used. |
|
38 """ |
|
39 raise NotImplementedError |
|
40 |
|
41 def delete(self, key): |
|
42 """ |
|
43 Delete a key from the cache, failing silently. |
|
44 """ |
|
45 raise NotImplementedError |
|
46 |
|
47 def get_many(self, keys): |
|
48 """ |
|
49 Fetch a bunch of keys from the cache. For certain backends (memcached, |
|
50 pgsql) this can be *much* faster when fetching multiple values. |
|
51 |
|
52 Returns a dict mapping each key in keys to its value. If the given |
|
53 key is missing, it will be missing from the response dict. |
|
54 """ |
|
55 d = {} |
|
56 for k in keys: |
|
57 val = self.get(k) |
|
58 if val is not None: |
|
59 d[k] = val |
|
60 return d |
|
61 |
|
62 def has_key(self, key): |
|
63 """ |
|
64 Returns True if the key is in the cache and has not expired. |
|
65 """ |
|
66 return self.get(key) is not None |
|
67 |
|
68 def incr(self, key, delta=1): |
|
69 """ |
|
70 Add delta to value in the cache. If the key does not exist, raise a |
|
71 ValueError exception. |
|
72 """ |
|
73 if key not in self: |
|
74 raise ValueError, "Key '%s' not found" % key |
|
75 new_value = self.get(key) + delta |
|
76 self.set(key, new_value) |
|
77 return new_value |
|
78 |
|
79 def decr(self, key, delta=1): |
|
80 """ |
|
81 Subtract delta from value in the cache. If the key does not exist, raise |
|
82 a ValueError exception. |
|
83 """ |
|
84 return self.incr(key, -delta) |
|
85 |
|
86 def __contains__(self, key): |
|
87 """ |
|
88 Returns True if the key is in the cache and has not expired. |
|
89 """ |
|
90 # This is a separate method, rather than just a copy of has_key(), |
|
91 # so that it always has the same functionality as has_key(), even |
|
92 # if a subclass overrides it. |
|
93 return self.has_key(key) |