Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/django/templatetags/cache.py: 16%
53 statements
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
1from django.core.cache import InvalidCacheBackendError, caches
2from django.core.cache.utils import make_template_fragment_key
3from django.template import Library, Node, TemplateSyntaxError, VariableDoesNotExist
5register = Library()
8class CacheNode(Node):
9 def __init__(self, nodelist, expire_time_var, fragment_name, vary_on, cache_name):
10 self.nodelist = nodelist
11 self.expire_time_var = expire_time_var
12 self.fragment_name = fragment_name
13 self.vary_on = vary_on
14 self.cache_name = cache_name
16 def render(self, context):
17 try:
18 expire_time = self.expire_time_var.resolve(context)
19 except VariableDoesNotExist:
20 raise TemplateSyntaxError(
21 '"cache" tag got an unknown variable: %r' % self.expire_time_var.var
22 )
23 if expire_time is not None:
24 try:
25 expire_time = int(expire_time)
26 except (ValueError, TypeError):
27 raise TemplateSyntaxError(
28 '"cache" tag got a non-integer timeout value: %r' % expire_time
29 )
30 if self.cache_name:
31 try:
32 cache_name = self.cache_name.resolve(context)
33 except VariableDoesNotExist:
34 raise TemplateSyntaxError(
35 '"cache" tag got an unknown variable: %r' % self.cache_name.var
36 )
37 try:
38 fragment_cache = caches[cache_name]
39 except InvalidCacheBackendError:
40 raise TemplateSyntaxError(
41 "Invalid cache name specified for cache tag: %r" % cache_name
42 )
43 else:
44 try:
45 fragment_cache = caches["template_fragments"]
46 except InvalidCacheBackendError:
47 fragment_cache = caches["default"]
49 vary_on = [var.resolve(context) for var in self.vary_on]
50 cache_key = make_template_fragment_key(self.fragment_name, vary_on)
51 value = fragment_cache.get(cache_key)
52 if value is None:
53 value = self.nodelist.render(context)
54 fragment_cache.set(cache_key, value, expire_time)
55 return value
58@register.tag("cache")
59def do_cache(parser, token):
60 """
61 This will cache the contents of a template fragment for a given amount
62 of time.
64 Usage::
66 {% load cache %}
67 {% cache [expire_time] [fragment_name] %}
68 .. some expensive processing ..
69 {% endcache %}
71 This tag also supports varying by a list of arguments::
73 {% load cache %}
74 {% cache [expire_time] [fragment_name] [var1] [var2] .. %}
75 .. some expensive processing ..
76 {% endcache %}
78 Optionally the cache to use may be specified thus::
80 {% cache .... using="cachename" %}
82 Each unique set of arguments will result in a unique cache entry.
83 """
84 nodelist = parser.parse(("endcache",))
85 parser.delete_first_token()
86 tokens = token.split_contents()
87 if len(tokens) < 3:
88 raise TemplateSyntaxError("'%r' tag requires at least 2 arguments." % tokens[0])
89 if len(tokens) > 3 and tokens[-1].startswith("using="):
90 cache_name = parser.compile_filter(tokens[-1][len("using=") :])
91 tokens = tokens[:-1]
92 else:
93 cache_name = None
94 return CacheNode(
95 nodelist,
96 parser.compile_filter(tokens[1]),
97 tokens[2], # fragment_name can't be a variable.
98 [parser.compile_filter(t) for t in tokens[3:]],
99 cache_name,
100 )