From a53959e814493c8e398a574ece04435ed458fca9 Mon Sep 17 00:00:00 2001 From: Anders Eriksen Date: Wed, 1 Feb 2012 14:23:16 +0100 Subject: [PATCH 01/14] Update gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ab76bac --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ + +django_varnish.egg-info/* +*.pyc \ No newline at end of file From 3d1753ebe74afa728651290b41a42261e89115c7 Mon Sep 17 00:00:00 2001 From: Anders Eriksen Date: Wed, 1 Feb 2012 14:23:42 +0100 Subject: [PATCH 02/14] Extended signals to add purging of old versions of urls using django redirect app. --- varnishapp/signals.py | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/varnishapp/signals.py b/varnishapp/signals.py index 8a1454e..6504633 100644 --- a/varnishapp/signals.py +++ b/varnishapp/signals.py @@ -1,11 +1,43 @@ from django.db.models.signals import post_save from django.db.models import get_model from django.conf import settings -from manager import manager +from varnishapp.manager import manager +import logging + +logger = logging.getLogger("varnish.invalidation") + +def purge_old_paths(abs_url): + + """ + If django redirects is installed, search for new paths based on given absolute url + and purge all the corresponding old paths to ensure the user gets a redirect to the + new path and not an old cached version of the page + """ + + if "django.contrib.redirects" in settings.INSTALLED_APPS: + from django.contrib.redirects.models import Redirect + + #find old paths for new path + oldpaths = Redirect.objects.filter(new_path=abs_url) + + for p in oldpaths: + logger.debug("OLD PATH TO PURGE: %s" % p.old_path) + + try: + manager.run('purge.url', r'^%s$' % str(p.old_path)) + except: + logger.warn('No varnish instance running. Could not purge %s' % str(p.old_path)) def absolute_url_purge_handler(sender, **kwargs): - manager.run('purge.url', r'^%s$' % kwargs['instance'].get_absolute_url()) + abs_url = kwargs['instance'].get_absolute_url() + + try: + manager.run('purge.url', r'^%s$' % abs_url) + except: + logger.warn('No varnish instance running. Could not purge %s ' % abs_url) + + purge_old_paths(abs_url) for model in getattr(settings, 'VARNISH_WATCHED_MODELS', ()): post_save.connect(absolute_url_purge_handler, sender=get_model(*model.split('.'))) \ No newline at end of file From 40e5e2e79759f2ec7a1a50b72184d752fe7614d9 Mon Sep 17 00:00:00 2001 From: Anders Eriksen Date: Wed, 1 Feb 2012 14:23:56 +0100 Subject: [PATCH 03/14] Added signals to manager.py to trigger them on init. --- varnishapp/manager.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/varnishapp/manager.py b/varnishapp/manager.py index ee9a0c0..f0838fd 100644 --- a/varnishapp/manager.py +++ b/varnishapp/manager.py @@ -3,4 +3,6 @@ from atexit import register manager = VarnishManager(getattr(settings, 'VARNISH_MANAGEMENT_ADDRS', ())) -register(manager.close) \ No newline at end of file +register(manager.close) + +from signals import * \ No newline at end of file From cf4a58036d45dfe944853b418b083fc554541763 Mon Sep 17 00:00:00 2001 From: "Anders G. Eriksen" Date: Thu, 2 Feb 2012 21:15:51 +0100 Subject: [PATCH 04/14] Cleanup import and comments in signals --- varnishapp/signals.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/varnishapp/signals.py b/varnishapp/signals.py index 6504633..94211ca 100644 --- a/varnishapp/signals.py +++ b/varnishapp/signals.py @@ -1,7 +1,7 @@ from django.db.models.signals import post_save from django.db.models import get_model from django.conf import settings -from varnishapp.manager import manager +from manager import manager import logging @@ -10,19 +10,17 @@ def purge_old_paths(abs_url): """ - If django redirects is installed, search for new paths based on given absolute url + If Django redirects app is installed, search for new paths based on given absolute url and purge all the corresponding old paths to ensure the user gets a redirect to the - new path and not an old cached version of the page + new path and not an old cached version of the page if i.e. the slug has changed. """ if "django.contrib.redirects" in settings.INSTALLED_APPS: from django.contrib.redirects.models import Redirect - #find old paths for new path oldpaths = Redirect.objects.filter(new_path=abs_url) for p in oldpaths: - logger.debug("OLD PATH TO PURGE: %s" % p.old_path) try: manager.run('purge.url', r'^%s$' % str(p.old_path)) From 9abe6819a6fa20dfe769dea0748b373cca23501c Mon Sep 17 00:00:00 2001 From: Anders Eriksen Date: Mon, 2 Apr 2012 11:56:59 +0200 Subject: [PATCH 05/14] Added signals for purging of api resources --- varnishapp/signals.py | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/varnishapp/signals.py b/varnishapp/signals.py index 94211ca..9aa04a8 100644 --- a/varnishapp/signals.py +++ b/varnishapp/signals.py @@ -38,4 +38,38 @@ def absolute_url_purge_handler(sender, **kwargs): purge_old_paths(abs_url) for model in getattr(settings, 'VARNISH_WATCHED_MODELS', ()): - post_save.connect(absolute_url_purge_handler, sender=get_model(*model.split('.'))) \ No newline at end of file + post_save.connect(absolute_url_purge_handler, sender=get_model(*model.split('.'))) + + + + +def api_resource_purge_handler (sender, **kwargs): + + """ + Purges object urls in the API. Requires a get_resource_url on the model that + returns the url of the api resource object base url. If using tastypie that would + look like something like this on a resource named person: + + @models.permalink + def get_resource_url(self): + return ('api_dispatch_detail', (), { + 'resource_name': 'person', + 'api_name': 'v1', + 'pk': self.id}) + + """ + instance = kwargs['instance'] + + if hasattr(instance, 'get_resource_url'): + resource_url = instance.get_resource_url() + + try: + manager.run('purge.url', r'^%s$' % resource_url) + except: + logger.warn('No varnish instance running. Could not purge %s ' % resource_url) + + purge_old_paths(resource_url) + + +for model in getattr(settings, 'VARNISH_WATCHED_MODELS', ()): + post_save.connect(api_resource_purge_handler, sender=get_model(*model.split('.'))) \ No newline at end of file From a87c4387068f4190323f42581cbd957e55b562cd Mon Sep 17 00:00:00 2001 From: Anders Eriksen Date: Mon, 2 Apr 2012 16:07:26 +0200 Subject: [PATCH 06/14] Purge urls starting with resource url and not only exact resource url --- varnishapp/signals.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/varnishapp/signals.py b/varnishapp/signals.py index 9aa04a8..6a9efcb 100644 --- a/varnishapp/signals.py +++ b/varnishapp/signals.py @@ -28,6 +28,12 @@ def purge_old_paths(abs_url): logger.warn('No varnish instance running. Could not purge %s' % str(p.old_path)) def absolute_url_purge_handler(sender, **kwargs): + """ + Purges the absolute url of the model instance + NB: It adds $ to the end of the purge, so no urls with parameters etc are purged, + only the url given by get_absolute_url itself + """ + abs_url = kwargs['instance'].get_absolute_url() try: @@ -64,7 +70,7 @@ def get_resource_url(self): resource_url = instance.get_resource_url() try: - manager.run('purge.url', r'^%s$' % resource_url) + manager.run('purge.url', r'^%s' % resource_url) except: logger.warn('No varnish instance running. Could not purge %s ' % resource_url) From 52b372f974dbc78367b97e0934e8012ef2b41c05 Mon Sep 17 00:00:00 2001 From: Anders Eriksen Date: Mon, 2 Apr 2012 17:27:50 +0200 Subject: [PATCH 07/14] docs update --- varnishapp/signals.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/varnishapp/signals.py b/varnishapp/signals.py index 6a9efcb..d929ec2 100644 --- a/varnishapp/signals.py +++ b/varnishapp/signals.py @@ -63,6 +63,8 @@ def get_resource_url(self): 'api_name': 'v1', 'pk': self.id}) + The method will purge all urls *starting* with the url + """ instance = kwargs['instance'] From 1c90433cd8ea8e4230ff94554cec3afb9c2246a7 Mon Sep 17 00:00:00 2001 From: Anders Eriksen Date: Mon, 9 Jul 2012 14:02:23 +0300 Subject: [PATCH 08/14] Added check to see if get_absolute_url exists on model to prevent errors. --- varnishapp/signals.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/varnishapp/signals.py b/varnishapp/signals.py index d929ec2..eb7cee4 100644 --- a/varnishapp/signals.py +++ b/varnishapp/signals.py @@ -33,15 +33,15 @@ def absolute_url_purge_handler(sender, **kwargs): NB: It adds $ to the end of the purge, so no urls with parameters etc are purged, only the url given by get_absolute_url itself """ - - abs_url = kwargs['instance'].get_absolute_url() - - try: - manager.run('purge.url', r'^%s$' % abs_url) - except: - logger.warn('No varnish instance running. Could not purge %s ' % abs_url) - - purge_old_paths(abs_url) + if hasattr(instance, 'get_absolute_url'): + abs_url = kwargs['instance'].get_absolute_url() + + try: + manager.run('purge.url', r'^%s$' % abs_url) + except: + logger.warn('No varnish instance running. Could not purge %s ' % abs_url) + + purge_old_paths(abs_url) for model in getattr(settings, 'VARNISH_WATCHED_MODELS', ()): post_save.connect(absolute_url_purge_handler, sender=get_model(*model.split('.'))) From 99ee58814365d68427fda6e8c24f582f6a376531 Mon Sep 17 00:00:00 2001 From: Anders Eriksen Date: Mon, 9 Jul 2012 14:23:25 +0300 Subject: [PATCH 09/14] Fix bug with missing instance object --- varnishapp/signals.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/varnishapp/signals.py b/varnishapp/signals.py index eb7cee4..b44f8d5 100644 --- a/varnishapp/signals.py +++ b/varnishapp/signals.py @@ -33,8 +33,10 @@ def absolute_url_purge_handler(sender, **kwargs): NB: It adds $ to the end of the purge, so no urls with parameters etc are purged, only the url given by get_absolute_url itself """ + instance = kwargs['instance'] + if hasattr(instance, 'get_absolute_url'): - abs_url = kwargs['instance'].get_absolute_url() + abs_url = instance.get_absolute_url() try: manager.run('purge.url', r'^%s$' % abs_url) From 7027f0f04f9f55554dd50110d2d95965c6e072c9 Mon Sep 17 00:00:00 2001 From: Anders Eriksen Date: Mon, 9 Jul 2012 14:25:36 +0300 Subject: [PATCH 10/14] Update master --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 99bf1a4..4d59b25 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name = "django-varnish", - version = '0.1', + version = '0.1.1', url = 'http://opensource.washingtontimes.com/projects/django-varnish/', author = 'Justin Quick', author_email= 'justquick@gmail.com', From 96d96b3992e7870cb4521b38be7091a316c91a74 Mon Sep 17 00:00:00 2001 From: Anders Eriksen Date: Tue, 19 Nov 2013 17:07:20 +0100 Subject: [PATCH 11/14] Change from purge to Varnish 3.0 syntax ban --- varnishapp/signals.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/varnishapp/signals.py b/varnishapp/signals.py index b44f8d5..dd6bdb1 100644 --- a/varnishapp/signals.py +++ b/varnishapp/signals.py @@ -23,7 +23,7 @@ def purge_old_paths(abs_url): for p in oldpaths: try: - manager.run('purge.url', r'^%s$' % str(p.old_path)) + manager.run('ban.url', r'^%s$' % str(p.old_path)) except: logger.warn('No varnish instance running. Could not purge %s' % str(p.old_path)) @@ -39,7 +39,7 @@ def absolute_url_purge_handler(sender, **kwargs): abs_url = instance.get_absolute_url() try: - manager.run('purge.url', r'^%s$' % abs_url) + manager.run('ban.url', r'^%s$' % abs_url) except: logger.warn('No varnish instance running. Could not purge %s ' % abs_url) @@ -82,4 +82,4 @@ def get_resource_url(self): for model in getattr(settings, 'VARNISH_WATCHED_MODELS', ()): - post_save.connect(api_resource_purge_handler, sender=get_model(*model.split('.'))) \ No newline at end of file + post_save.connect(api_resource_purge_handler, sender=get_model(*model.split('.'))) From f9b9b210213267b57c4432accd10656348931641 Mon Sep 17 00:00:00 2001 From: Anders Eriksen Date: Tue, 19 Nov 2013 17:07:44 +0100 Subject: [PATCH 12/14] Change from purge to Varnish 3.0 syntax ban --- varnishapp/signals.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/varnishapp/signals.py b/varnishapp/signals.py index dd6bdb1..f625a9e 100644 --- a/varnishapp/signals.py +++ b/varnishapp/signals.py @@ -74,7 +74,7 @@ def get_resource_url(self): resource_url = instance.get_resource_url() try: - manager.run('purge.url', r'^%s' % resource_url) + manager.run('ban.url', r'^%s' % resource_url) except: logger.warn('No varnish instance running. Could not purge %s ' % resource_url) From 8e83408bd268c10bc89ee921b9f4ee1b72231ddf Mon Sep 17 00:00:00 2001 From: Anders Eriksen Date: Tue, 19 Nov 2013 17:08:52 +0100 Subject: [PATCH 13/14] Upped version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 4d59b25..695dda0 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name = "django-varnish", - version = '0.1.1', + version = '0.1.2', url = 'http://opensource.washingtontimes.com/projects/django-varnish/', author = 'Justin Quick', author_email= 'justquick@gmail.com', From f68bc80752e98604ade67b443ca63083d8d1bfc3 Mon Sep 17 00:00:00 2001 From: Anders Eriksen Date: Wed, 20 Nov 2013 15:11:53 +0100 Subject: [PATCH 14/14] Added more logging when banning urls --- varnishapp/signals.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/varnishapp/signals.py b/varnishapp/signals.py index f625a9e..1fa2c28 100644 --- a/varnishapp/signals.py +++ b/varnishapp/signals.py @@ -7,6 +7,7 @@ logger = logging.getLogger("varnish.invalidation") + def purge_old_paths(abs_url): """ @@ -23,7 +24,7 @@ def purge_old_paths(abs_url): for p in oldpaths: try: - manager.run('ban.url', r'^%s$' % str(p.old_path)) + resp = manager.run('ban.url', r'^%s$' % str(p.old_path)) except: logger.warn('No varnish instance running. Could not purge %s' % str(p.old_path)) @@ -39,7 +40,10 @@ def absolute_url_purge_handler(sender, **kwargs): abs_url = instance.get_absolute_url() try: - manager.run('ban.url', r'^%s$' % abs_url) + banurl = r'^%s$' % abs_url + logger.info("Banning %s" % banurl) + resp = manager.run('ban.url', banurl) + logger.info(resp) except: logger.warn('No varnish instance running. Could not purge %s ' % abs_url)