summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorCurtis Maloney <curtis@tinbrain.net>2013-10-04 07:36:21 +1000
committerTim Graham <timograham@gmail.com>2013-10-23 19:27:08 -0400
commit8688f03eef9cf5fd763ba35481ddcff933a60c30 (patch)
tree2f3e1644eb31beecc4e128e4770b29c6c82fc186 /django
parent4ce5c119b5a6109058500e207333cc6889d78abe (diff)
Fixed #20945 -- Allowed cache tag to use a specific cache.
Diffstat (limited to 'django')
-rw-r--r--django/templatetags/cache.py34
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,
+ )