From 32e14883275bd5b6ffb9487cd43f7d1252d54959 Mon Sep 17 00:00:00 2001 From: mitchelljkotler Date: Tue, 13 Dec 2016 20:25:17 -0500 Subject: [PATCH 1/5] Create cacheback.py cacheback template tag --- cacheback/templatetags/cacheback.py | 79 +++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 cacheback/templatetags/cacheback.py diff --git a/cacheback/templatetags/cacheback.py b/cacheback/templatetags/cacheback.py new file mode 100644 index 0000000..bb9192c --- /dev/null +++ b/cacheback/templatetags/cacheback.py @@ -0,0 +1,79 @@ +from __future__ import unicode_literals + +from django.core.cache import InvalidCacheBackendError, caches +from django.core.cache.utils import make_template_fragment_key +from django.template import ( + Library, Node, TemplateSyntaxError, VariableDoesNotExist, +) + +from cacheback.base import Job + +import time + +register = Library() + + +class CacheJob(Job): + """Class to handle asynchronous loading of all cacheback template tags""" + + def fetch(self, nodelist, context, expire_time, fragment_name, vary_on): + """Render the node""" + return self.nodelist.render(context) + + def expiry(self, nodelist, context, expire_time, fragment_name, vary_on): + """When to expire""" + return time.time() + expire_time + + def key(self, nodelist, context, expire_time, fragment_name, vary_on): + """Make the cache key""" + return make_template_fragment_key(fragment_name, vary_on) + + +class CacheNode(Node): + def __init__(self, nodelist, expire_time_var, fragment_name, vary_on): + self.nodelist = nodelist + self.expire_time_var = expire_time_var + self.fragment_name = fragment_name + self.vary_on = vary_on + + def render(self, context): + try: + expire_time = self.expire_time_var.resolve(context) + except VariableDoesNotExist: + raise TemplateSyntaxError('"cache" tag got an unknown variable: %r' % self.expire_time_var.var) + try: + expire_time = int(expire_time) + except (ValueError, TypeError): + raise TemplateSyntaxError('"cache" tag got a non-integer timeout value: %r' % expire_time) + + vary_on = [var.resolve(context) for var in self.vary_on] + return CacheJob().get(self.nodelist, context, expire_time, self.fragment_name, vary_on) + + +@register.tag('cacheback') +def do_cacheback(parser, token): + """ + This will cache the contents of a template fragment for a given amount + of time. + Usage:: + {% load cacheback %} + {% cacheback [expire_time] [fragment_name] %} + .. some expensive processing .. + {% endcacheback %} + This tag also supports varying by a list of arguments:: + {% load cacheback %} + {% cacheback [expire_time] [fragment_name] [var1] [var2] .. %} + .. some expensive processing .. + {% endcacheback %} + Each unique set of arguments will result in a unique cache entry. + """ + nodelist = parser.parse(('endcacheback',)) + parser.delete_first_token() + tokens = token.split_contents() + if len(tokens) < 3: + raise TemplateSyntaxError("'%r' tag requires at least 2 arguments." % tokens[0]) + 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:]], +) From b65bdf0e5d1e598e9a825b374216168cdf0036f2 Mon Sep 17 00:00:00 2001 From: mitchelljkotler Date: Tue, 13 Dec 2016 20:30:40 -0500 Subject: [PATCH 2/5] Create __init__.py --- cacheback/templatetags/__init__.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 cacheback/templatetags/__init__.py diff --git a/cacheback/templatetags/__init__.py b/cacheback/templatetags/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/cacheback/templatetags/__init__.py @@ -0,0 +1 @@ + From 1eaa3981f96ecd4f216b11aa1f9f0ff44dc7c8e8 Mon Sep 17 00:00:00 2001 From: mitchelljkotler Date: Tue, 13 Dec 2016 22:09:05 -0500 Subject: [PATCH 3/5] Update cacheback.py Pyflakes cleanup --- cacheback/templatetags/cacheback.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/cacheback/templatetags/cacheback.py b/cacheback/templatetags/cacheback.py index bb9192c..fcc0fcd 100644 --- a/cacheback/templatetags/cacheback.py +++ b/cacheback/templatetags/cacheback.py @@ -1,15 +1,13 @@ from __future__ import unicode_literals -from django.core.cache import InvalidCacheBackendError, caches +import time + from django.core.cache.utils import make_template_fragment_key from django.template import ( - Library, Node, TemplateSyntaxError, VariableDoesNotExist, -) + Library, Node, TemplateSyntaxError, VariableDoesNotExist) from cacheback.base import Job -import time - register = Library() @@ -40,11 +38,13 @@ def render(self, context): try: expire_time = self.expire_time_var.resolve(context) except VariableDoesNotExist: - raise TemplateSyntaxError('"cache" tag got an unknown variable: %r' % self.expire_time_var.var) + raise TemplateSyntaxError( + '"cacheback" tag got an unknown variable: %r' % self.expire_time_var.var) try: expire_time = int(expire_time) except (ValueError, TypeError): - raise TemplateSyntaxError('"cache" tag got a non-integer timeout value: %r' % expire_time) + raise TemplateSyntaxError( + '"cacheback" tag got a non-integer timeout value: %r' % expire_time) vary_on = [var.resolve(context) for var in self.vary_on] return CacheJob().get(self.nodelist, context, expire_time, self.fragment_name, vary_on) @@ -76,4 +76,4 @@ def do_cacheback(parser, token): nodelist, parser.compile_filter(tokens[1]), tokens[2], # fragment_name can't be a variable. [parser.compile_filter(t) for t in tokens[3:]], -) + ) From 18a4896edaf255f5f29b7d43346002ff3303bafe Mon Sep 17 00:00:00 2001 From: mitchelljkotler Date: Tue, 13 Dec 2016 22:09:37 -0500 Subject: [PATCH 4/5] Update __init__.py Pyflakes cleanup From edb08de97a7394cf0cb40b5f952bf7655d3a1bd3 Mon Sep 17 00:00:00 2001 From: mitchelljkotler Date: Tue, 13 Dec 2016 22:15:33 -0500 Subject: [PATCH 5/5] Update cacheback.py Whitespace --- cacheback/templatetags/cacheback.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cacheback/templatetags/cacheback.py b/cacheback/templatetags/cacheback.py index fcc0fcd..6bf0b2f 100644 --- a/cacheback/templatetags/cacheback.py +++ b/cacheback/templatetags/cacheback.py @@ -13,15 +13,15 @@ class CacheJob(Job): """Class to handle asynchronous loading of all cacheback template tags""" - + def fetch(self, nodelist, context, expire_time, fragment_name, vary_on): """Render the node""" return self.nodelist.render(context) - + def expiry(self, nodelist, context, expire_time, fragment_name, vary_on): """When to expire""" return time.time() + expire_time - + def key(self, nodelist, context, expire_time, fragment_name, vary_on): """Make the cache key""" return make_template_fragment_key(fragment_name, vary_on)