diff options
-rw-r--r-- | main/utils.py | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/main/utils.py b/main/utils.py index c258c115..40010b86 100644 --- a/main/utils.py +++ b/main/utils.py @@ -1,2 +1,37 @@ +try: + import cPickle as pickle +except ImportError: + import pickle +from django.utils.hashcompat import md5_constructor + +def cache_function(length): + """ + A variant of the snippet posted by Jeff Wheeler at + http://www.djangosnippets.org/snippets/109/ + + Caches a function, using the function and its arguments as the key, and the + return value as the value saved. It passes all arguments on to the + function, as it should. + + The decorator itself takes a length argument, which is the number of + seconds the cache will keep the result around. + """ + def decorator(func): + def inner_func(*args, **kwargs): + from django.core.cache import cache + + raw = [func.__name__, func.__module__, args, kwargs] + pickled = pickle.dumps(raw, protocol=pickle.HIGHEST_PROTOCOL) + key = md5_constructor(pickled).hexdigest() + value = cache.get(key) + if value is not None: + return value + else: + result = func(*args, **kwargs) + cache.set(key, result, length) + return result + return inner_func + return decorator + #utility to make a pair of django choices make_choice = lambda l: [(str(m), str(m)) for m in l] |