Login

Cached template filters

Author:
coleifer
Posted:
May 8, 2010
Language:
Python
Version:
1.1
Score:
1 (after 1 ratings)

Say you'd like to cache one of your template filters. This decorator acts sort of like memoize, caching a result set based on the arguments passed in (which are used as the cache key).

 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. Template tag - list punctuation for a list of items by shapiromatron 2 months ago
  2. JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 2 months, 1 week ago
  3. Serializer factory with Django Rest Framework by julio 9 months, 1 week ago
  4. Image compression before saving the new model / work with JPG, PNG by Schleidens 9 months, 4 weeks ago
  5. Help text hyperlinks by sa2812 10 months, 3 weeks ago

Comments

Please login first before commenting.