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

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 

4 

5register = Library() 

6 

7 

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 

15 

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"] 

48 

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 

56 

57 

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. 

63 

64 Usage:: 

65 

66 {% load cache %} 

67 {% cache [expire_time] [fragment_name] %} 

68 .. some expensive processing .. 

69 {% endcache %} 

70 

71 This tag also supports varying by a list of arguments:: 

72 

73 {% load cache %} 

74 {% cache [expire_time] [fragment_name] [var1] [var2] .. %} 

75 .. some expensive processing .. 

76 {% endcache %} 

77 

78 Optionally the cache to use may be specified thus:: 

79 

80 {% cache .... using="cachename" %} 

81 

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 )