Cached template filters

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from django.conf import settings
from django.db.models.query import QuerySet
from django.utils.cache import cache
from django.utils.hashcompat import md5_constructor

def stringify_object(obj):
    if isinstance(obj, QuerySet):
        return obj.query.as_sql()
    return unicode(obj)

def key_from_args(*args, **kwargs):
    strings = []
    for arg in args:
        strings.append(stringify_object(arg))
    for k,v in kwargs.items():
        strings.append('%s=%s' % (k, stringify_object(v)))
    return md5_constructor(''.join(strings).hexdigest())

def cached_filter(func, timeout=300):
    def inner(*args, **kwargs):
        if settings.DEBUG:
            return func(*args, **kwargs)
        cache_key = key_from_args(*args, **kwargs)
        result = cache.get(cache_key)
        if not result:
            result = func(*args, **kwargs)
            cache.set(cache_key, result, timeout)
        return result
    inner._decorated_function = func
    return inner

More like this

  1. Querystring Builder - create urls with GET params by jibberia 2 years, 4 months ago
  2. Automatic Memoization Decorator by nikmolnar 4 months, 2 weeks ago
  3. Run and cache only one instance of a heavy request by farnsworth 2 years, 9 months ago
  4. Functional Filters by waterson 5 years, 7 months ago
  5. Language aware cache decorator by bartTC 4 years ago

Comments

(Forgotten your password?)