diff --git a/wagtail/contrib/wagtailfrontendcache/__init__.py b/wagtail/contrib/wagtailfrontendcache/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/wagtail/contrib/wagtailfrontendcache/models.py b/wagtail/contrib/wagtailfrontendcache/models.py new file mode 100644 index 000000000..e69de29bb diff --git a/wagtail/contrib/wagtailfrontendcache/purger.py b/wagtail/contrib/wagtailfrontendcache/purger.py new file mode 100644 index 000000000..ca00408e2 --- /dev/null +++ b/wagtail/contrib/wagtailfrontendcache/purger.py @@ -0,0 +1,14 @@ +from urlparse import urlparse, urlunparse +import requests + +from django.conf import settings + + +def purge_page_from_cache(page): + # Build purge url + varnish_url = urlparse(getattr(settings, 'WAGTAILFRONTENDCACHE_LOCATION', 'http://127.0.0.1:8000/')) + page_url = urlparse(page.url) + purge_url = urlunparse((varnish_url.scheme, varnish_url.netloc, page_url.path, page_url.params, page_url.query, page_url.fragment)) + + # Purge + requests.request('PURGE', purge_url) diff --git a/wagtail/contrib/wagtailfrontendcache/signal_handlers.py b/wagtail/contrib/wagtailfrontendcache/signal_handlers.py new file mode 100644 index 000000000..7f5dde81b --- /dev/null +++ b/wagtail/contrib/wagtailfrontendcache/signal_handlers.py @@ -0,0 +1,24 @@ +from django.db import models +from django.db.models.signals import post_save, post_delete + +from wagtail.wagtailcore.models import Page + +from wagtail.contrib.wagtailfrontendcache import purger + + +def post_save_signal_handler(instance, **kwargs): + purger.purge_page_from_cache(instance) + + +def post_delete_signal_handler(instance, **kwargs): + purger.purge_page_from_cache(instance) + + +def register_signal_handlers(): + # Get list of models that are page types + indexed_models = [model for model in models.get_models() if issubclass(model, Page)] + + # Loop through list and register signal handlers for each one + for model in indexed_models: + post_save.connect(post_save_signal_handler, sender=model) + post_delete.connect(post_delete_signal_handler, sender=model)