Here’s a simple class for a template tag that caches its output (with apologies to Chris Parnell and Andy Samberg):
from django.core import template
from django.core.cache import cache
from django.conf.settings import DEBUG
class CachedNode(template.Node):
"""
Cached template node.
Subclasses should define the methods
get_cache_key() and get_content() instead of the
standard render() method. Subclasses may also
define the class attribute cache_timeout to
override the default cache timeout of ten minutes.
"""
cache_timeout = 600
def render(self, context):
if DEBUG:
return self.get_content(context)
key = self.get_cache_key(context)
content = cache.get(key)
if not content:
content = self.get_content(context)
cache.set(key, content, self.cache_timeout)
return content
def get_cache_key(self, context):
raise NotImplementedError
def get_content(self, context):
raise NotImplementedError
Comments:
2 questions:
- what's template ?
- the "cache" variable seems to come from nowhere ;)
phil, I believe this code assumes these two imports:
from django.core import template
from django.core.cache import cache
Ok that's fine, Adrian ;)
Thanks, Phil - I've updated the code snippet to make that clear.
any chance of checking that into the core?
Django is the best--true that--double true.
Thanks for the post. Keep the tips coming!
Leave a comment: