kopia lustrzana https://github.com/wagtail/wagtail
Improved 'purge_page_from_cache' to purge the url for any managed language
rodzic
c309753378
commit
b3fa09b95e
|
@ -24,6 +24,7 @@ Changelog
|
||||||
* Add new `wagtail_icon` template tag to facilitate making admin icons accessible (Sander Tuit)
|
* Add new `wagtail_icon` template tag to facilitate making admin icons accessible (Sander Tuit)
|
||||||
* Set `ALLOWED_HOSTS` in the project template to allow any host in development (Tom Dyson)
|
* Set `ALLOWED_HOSTS` in the project template to allow any host in development (Tom Dyson)
|
||||||
* Expose reusable client-side code to build Draftail extensions (Thibaud Colas)
|
* Expose reusable client-side code to build Draftail extensions (Thibaud Colas)
|
||||||
|
* Added `WAGTAILFRONTENDCACHE_LANGUAGES` setting to specify the languages whose URLs are to be purged when using `i18n_patterns` (PyMan Claudio Marinozzi)
|
||||||
* Fix: Status button on 'edit page' now links to the correct URL when live and draft slug differ (LB (Ben Johnston))
|
* Fix: Status button on 'edit page' now links to the correct URL when live and draft slug differ (LB (Ben Johnston))
|
||||||
* Fix: Image title text in the gallery and in the chooser now wraps for long filenames (LB (Ben Johnston), Luiz Boaretto)
|
* Fix: Image title text in the gallery and in the chooser now wraps for long filenames (LB (Ben Johnston), Luiz Boaretto)
|
||||||
* Fix: Move image editor action buttons to the bottom of the form on mobile (Julian Gallo)
|
* Fix: Move image editor action buttons to the bottom of the form on mobile (Julian Gallo)
|
||||||
|
|
|
@ -52,8 +52,11 @@ Add a new item into the ``WAGTAILFRONTENDCACHE`` setting and set the ``BACKEND``
|
||||||
'LOCATION': 'http://localhost:8000',
|
'LOCATION': 'http://localhost:8000',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
WAGTAILFRONTENDCACHE_LANGUAGES = []
|
||||||
|
|
||||||
|
|
||||||
|
Set ``WAGTAILFRONTENDCACHE_LANGUAGES`` to a list of languages (typically equal to ``[l[0] for l in settings.LANGUAGES]``) to also purge the urls for each language of a purging url. This setting needs ``settings.USE_I18N`` to be ``True`` to work. Its default is an empty list.
|
||||||
|
|
||||||
Finally, make sure you have configured your frontend cache to accept PURGE requests:
|
Finally, make sure you have configured your frontend cache to accept PURGE requests:
|
||||||
|
|
||||||
- `Varnish <https://www.varnish-cache.org/docs/3.0/tutorial/purging.html>`_
|
- `Varnish <https://www.varnish-cache.org/docs/3.0/tutorial/purging.html>`_
|
||||||
|
|
|
@ -43,6 +43,7 @@ Other features
|
||||||
* Add new `wagtail_icon` template tag to facilitate making admin icons accessible (Sander Tuit)
|
* Add new `wagtail_icon` template tag to facilitate making admin icons accessible (Sander Tuit)
|
||||||
* Set `ALLOWED_HOSTS` in the project template to allow any host in development (Tom Dyson)
|
* Set `ALLOWED_HOSTS` in the project template to allow any host in development (Tom Dyson)
|
||||||
* Expose reusable client-side code to build Draftail extensions (Thibaud Colas)
|
* Expose reusable client-side code to build Draftail extensions (Thibaud Colas)
|
||||||
|
* Added ``WAGTAILFRONTENDCACHE_LANGUAGES`` setting to specify the languages whose URLs are to be purged when using ``i18n_patterns`` (PyMan Claudio Marinozzi)
|
||||||
|
|
||||||
Bug fixes
|
Bug fixes
|
||||||
~~~~~~~~~
|
~~~~~~~~~
|
||||||
|
|
|
@ -209,6 +209,18 @@ class TestCachePurgingSignals(TestCase):
|
||||||
page.save_revision().publish()
|
page.save_revision().publish()
|
||||||
self.assertEqual(PURGED_URLS, [])
|
self.assertEqual(PURGED_URLS, [])
|
||||||
|
|
||||||
|
@override_settings(ROOT_URLCONF='wagtail.tests.urls_multilang',
|
||||||
|
LANGUAGE_CODE='en',
|
||||||
|
WAGTAILFRONTENDCACHE_LANGUAGES=['en'])
|
||||||
|
def test_purge_on_publish_in_multilang_env(self):
|
||||||
|
from django.conf import settings
|
||||||
|
PURGED_URLS[:] = [] # reset PURGED_URLS to the empty list
|
||||||
|
page = EventIndex.objects.get(url_path='/home/events/')
|
||||||
|
page.save_revision().publish()
|
||||||
|
self.assertEqual(len(PURGED_URLS), len(settings.WAGTAILFRONTENDCACHE_LANGUAGES) * 2)
|
||||||
|
for isocode, description in settings.WAGTAILFRONTENDCACHE_LANGUAGES:
|
||||||
|
self.assertIn('http://localhost/%s/events/' % isocode, PURGED_URLS)
|
||||||
|
|
||||||
|
|
||||||
class TestPurgeBatchClass(TestCase):
|
class TestPurgeBatchClass(TestCase):
|
||||||
# Tests the .add_*() methods on PurgeBatch. The .purge() method is tested
|
# Tests the .add_*() methods on PurgeBatch. The .purge() method is tested
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
import logging
|
import logging
|
||||||
|
import re
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
from django.utils.module_loading import import_string
|
from django.utils.module_loading import import_string
|
||||||
|
from django.utils.six.moves.urllib.parse import urlparse, urlunparse
|
||||||
|
|
||||||
logger = logging.getLogger('wagtail.frontendcache')
|
logger = logging.getLogger('wagtail.frontendcache')
|
||||||
|
|
||||||
|
@ -54,12 +56,40 @@ def get_backends(backend_settings=None, backends=None):
|
||||||
|
|
||||||
|
|
||||||
def purge_url_from_cache(url, backend_settings=None, backends=None):
|
def purge_url_from_cache(url, backend_settings=None, backends=None):
|
||||||
for backend_name, backend in get_backends(backend_settings, backends).items():
|
purge_urls_from_cache([url], backend_settings=backend_settings, backends=backends)
|
||||||
logger.info("[%s] Purging URL: %s", backend_name, url)
|
|
||||||
backend.purge(url)
|
|
||||||
|
|
||||||
|
|
||||||
def purge_urls_from_cache(urls, backend_settings=None, backends=None):
|
def purge_urls_from_cache(urls, backend_settings=None, backends=None):
|
||||||
|
# Convert each url to urls one for each managed language (WAGTAILFRONTENDCACHE_LANGUAGES setting).
|
||||||
|
# The managed languages are common to all the defined backends.
|
||||||
|
# This depends on settings.USE_I18N
|
||||||
|
languages = getattr(settings, 'WAGTAILFRONTENDCACHE_LANGUAGES', [])
|
||||||
|
if settings.USE_I18N and languages:
|
||||||
|
langs_regex = "^/(%s)/" % "|".join(languages)
|
||||||
|
new_urls = []
|
||||||
|
|
||||||
|
# Purge the given url for each managed language
|
||||||
|
for isocode, description in languages:
|
||||||
|
for url in urls:
|
||||||
|
up = urlparse(url)
|
||||||
|
new_url = urlunparse((
|
||||||
|
up.scheme,
|
||||||
|
up.netloc,
|
||||||
|
re.sub(langs_regex, "/%s/" % isocode, up.path),
|
||||||
|
up.params,
|
||||||
|
up.query,
|
||||||
|
up.fragment
|
||||||
|
))
|
||||||
|
|
||||||
|
# Check for best performance. True if re.sub found no match
|
||||||
|
# It happens when i18n_patterns was not used in urls.py to serve content for different languages from different URLs
|
||||||
|
if new_url in new_urls:
|
||||||
|
continue
|
||||||
|
|
||||||
|
new_urls.append(new_url)
|
||||||
|
|
||||||
|
urls = new_urls
|
||||||
|
|
||||||
for backend_name, backend in get_backends(backend_settings, backends).items():
|
for backend_name, backend in get_backends(backend_settings, backends).items():
|
||||||
for url in urls:
|
for url in urls:
|
||||||
logger.info("[%s] Purging URL: %s", backend_name, url)
|
logger.info("[%s] Purging URL: %s", backend_name, url)
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
from __future__ import absolute_import, unicode_literals
|
||||||
|
|
||||||
|
from django.conf.urls import include, url
|
||||||
|
from django.conf.urls.i18n import i18n_patterns
|
||||||
|
|
||||||
|
from wagtail.core import urls as wagtail_urls
|
||||||
|
|
||||||
|
|
||||||
|
urlpatterns = i18n_patterns(url(r'', include(wagtail_urls)))
|
Ładowanie…
Reference in New Issue