Add utility cache_function

This allows caching the results of an arbitrary function and its arguments
in the Django-managed cache, e.g. memcached in production.

Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Dan McGee 2010-06-21 00:50:13 -05:00
parent 03ccd8ad8c
commit 8ba6ad8521

View File

@ -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]