diff options
| author | Curtis Maloney <curtis@tinbrain.net> | 2013-10-04 07:36:21 +1000 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2013-10-23 19:27:08 -0400 |
| commit | 8688f03eef9cf5fd763ba35481ddcff933a60c30 (patch) | |
| tree | 2f3e1644eb31beecc4e128e4770b29c6c82fc186 /django | |
| parent | 4ce5c119b5a6109058500e207333cc6889d78abe (diff) | |
Fixed #20945 -- Allowed cache tag to use a specific cache.
Diffstat (limited to 'django')
| -rw-r--r-- | django/templatetags/cache.py | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/django/templatetags/cache.py b/django/templatetags/cache.py index 85ce67f1cc..86555af45b 100644 --- a/django/templatetags/cache.py +++ b/django/templatetags/cache.py @@ -1,17 +1,24 @@ from __future__ import unicode_literals +from django.core.cache import get_cache, InvalidCacheBackendError from django.core.cache.utils import make_template_fragment_key from django.template import Library, Node, TemplateSyntaxError, VariableDoesNotExist -from django.core.cache import cache register = Library() +try: + default_cache = get_cache('template_fragments') +except InvalidCacheBackendError: + from django.core.cache import cache as default_cache + + class CacheNode(Node): - def __init__(self, nodelist, expire_time_var, fragment_name, vary_on): + def __init__(self, nodelist, expire_time_var, fragment_name, vary_on, cache_name): self.nodelist = nodelist self.expire_time_var = expire_time_var self.fragment_name = fragment_name self.vary_on = vary_on + self.cache_name = cache_name def render(self, context): try: @@ -22,6 +29,17 @@ class CacheNode(Node): expire_time = int(expire_time) except (ValueError, TypeError): raise TemplateSyntaxError('"cache" tag got a non-integer timeout value: %r' % expire_time) + if self.cache_name: + try: + cache_name = self.cache_name.resolve(context) + except VariableDoesNotExist: + raise TemplateSyntaxError('"cache" tag got an unknown variable: %r' % self.cache_name.var) + try: + cache = get_cache(cache_name) + except InvalidCacheBackendError: + raise TemplateSyntaxError('Invalid cache name specified for cache tag: %r' % cache_name) + else: + cache = default_cache vary_on = [var.resolve(context) for var in self.vary_on] cache_key = make_template_fragment_key(self.fragment_name, vary_on) value = cache.get(cache_key) @@ -50,6 +68,9 @@ def do_cache(parser, token): .. some expensive processing .. {% endcache %} + Optionally the cache to use may be specified thus:: + + {% cache .... using="cachename" %} Each unique set of arguments will result in a unique cache entry. """ nodelist = parser.parse(('endcache',)) @@ -57,7 +78,14 @@ def do_cache(parser, token): tokens = token.split_contents() if len(tokens) < 3: raise TemplateSyntaxError("'%r' tag requires at least 2 arguments." % tokens[0]) + if len(tokens) > 3 and tokens[-1].startswith('using='): + cache_name = parser.compile_filter(tokens[-1][len('using='):]) + tokens = tokens[:-1] + else: + cache_name = None return CacheNode(nodelist, parser.compile_filter(tokens[1]), tokens[2], # fragment_name can't be a variable. - [parser.compile_filter(t) for t in tokens[3:]]) + [parser.compile_filter(t) for t in tokens[3:]], + cache_name, + ) |
