Очистка кэша на стороне клиента
Многие веб-сайты используют кэш на стороне клиента, такой как Varnish, Squid, Cloudflare или CloudFront, для повышения производительности. Однако недостатком использования кэша на стороне клиента является то, что он плохо реагирует на обновление контента и часто хранит старую версию страницы в кэше после её обновления.
Этот документ описывает, как настроить Wagtail для очистки старых версий страниц из кэша на стороне клиента всякий раз, когда страница обновляется.
Настройка
Во-первых, добавьте "wagtail.contrib.frontend_cache" в ваш INSTALLED_APPS:
INSTALLED_APPS = [ ... "wagtail.contrib.frontend_cache" ]
Модуль wagtailfrontendcache предоставляет набор обработчиков сигналов, которые автоматически очистят кэш всякий раз, когда страница публикуется или удаляется. Эти обработчики сигналов автоматически регистрируются при загрузке приложения wagtail.contrib.frontend_cache.
Varnish/Squid
Добавьте новую запись в настройку WAGTAILFRONTENDCACHE и установите параметр BACKEND в значение wagtail.contrib.frontend_cache.backends.HTTPBackend. Этот бэкенд требует дополнительного параметра LOCATION, указывающего, где работает кэш (это должно быть прямое подключение к серверу и не может проходить через другой прокси).
# settings.py
WAGTAILFRONTENDCACHE = {
'varnish': {
'BACKEND': 'wagtail.contrib.frontend_cache.backends.HTTPBackend',
'LOCATION': 'http://localhost:8000',
},
}
WAGTAILFRONTENDCACHE_LANGUAGES = []
Установите WAGTAILFRONTENDCACHE_LANGUAGES в список языков (обычно равный [l[0] for l in settings.LANGUAGES]) для очистки URL-адресов каждого языка при очистке URL. Для работы этой настройки необходимо, чтобы settings.USE_I18N было установлено в значение True. По умолчанию значение пустой список.
Наконец, убедитесь, что ваш кэш на стороне клиента принимает запросы PURGE:
Cloudflare
Во-первых, вам необходимо зарегистрировать учётную запись Cloudflare, если у вас её ещё нет. Вы можете сделать это здесь: Регистрация на Cloudflare
Добавьте запись в WAGTAILFRONTENDCACHE и установите параметр BACKEND в значение wagtail.contrib.frontend_cache.backends.CloudflareBackend.
Этот бэкенд может быть настроен для использования API-ключа глобальной учётной записи или токена API с ограниченным доступом.
Для использования API-ключа глобальной учётной записи найдите ключ как описано в документации Cloudflare и укажите параметры EMAIL и API_KEY.
Для использования ограниченного токена API создайте токен с разрешением «Зона, Очистка кэша» и укажите параметр BEARER_TOKEN.
Для любого варианта необходимо установить параметр ZONEID. Чтобы найти ZONEID для вашего домена, обратитесь к документации API Cloudflare.
С API-ключом:
# settings.py
WAGTAILFRONTENDCACHE = {
'cloudflare': {
'BACKEND': 'wagtail.contrib.frontend_cache.backends.CloudflareBackend',
'EMAIL': 'your-cloudflare-email-address@example.com',
'API_KEY': 'your cloudflare api key',
'ZONEID': 'your cloudflare domain zone id',
},
}
С токеном API:
# settings.py
WAGTAILFRONTENDCACHE = {
'cloudflare': {
'BACKEND': 'wagtail.contrib.frontend_cache.backends.CloudflareBackend',
'BEARER_TOKEN': 'your cloudflare bearer token',
'ZONEID': 'your cloudflare domain zone id',
},
}
Amazon CloudFront
В Amazon Web Services вам потребуется как минимум одно распределение веб-сайтов CloudFront. Если у вас его нет, вы можете получить его здесь: Начало работы с CloudFront
Добавьте запись в WAGTAILFRONTENDCACHE и установите параметр BACKEND в значение wagtail.contrib.frontend_cache.backends.CloudfrontBackend. Этот бэкенд требует одного дополнительного параметра DISTRIBUTION_ID (ID распределения, сгенерированный CloudFront).
WAGTAILFRONTENDCACHE = {
'cloudfront': {
'BACKEND': 'wagtail.contrib.frontend_cache.backends.CloudfrontBackend',
'DISTRIBUTION_ID': 'your-distribution-id',
},
}
Настройка учетных данных может быть выполнена несколькими способами. Вам не нужно будет хранить их в файле настроек Django. Подробнее об этом можно узнать здесь: Документация Boto 3
Если вы используете Wagtail для нескольких сайтов и каждый сайт имеет собственное распределение CloudFront, укажите отображение, а не одно распределение. Убедитесь, что отображение соответствует именам хостов, указанным в настройках сайта.
WAGTAILFRONTENDCACHE = {
'cloudfront': {
'BACKEND': 'wagtail.contrib.frontend_cache.backends.CloudfrontBackend',
'DISTRIBUTION_ID': {
'www.wagtail.org': 'your-distribution-id',
'www.madewithwagtail.org': 'your-distribution-id',
},
},
}
Примечание
В большинстве случаев в вашем отображении следует использовать абсолютные URL-адреса с префиксом www доменов. Убирайте префикс www только если вы уверены, что он не используется (например, поддомен).
Azure CDN
С Azure CDN вам понадобится профиль CDN с настроенным конечным пунктом.
Внешние зависимости этого бэкенда:
Пакет PyPI | Необходим | Причина |
|---|---|---|
Да | Взаимодействие с CDN-сервисом. | |
Нет | Получение учетных данных. Это необязательно, если вы хотите указать свои собственные учетные данные, используя настройку | |
Нет | Для получения идентификатора подписки. Избыточно, если вы хотите явно указать настройку |
Добавьте запись в WAGTAILFRONTENDCACHE и установите параметр BACKEND в значение wagtail.contrib.frontend_cache.backends.AzureCdnBackend. Для этого бэкенда необходимо установить следующие настройки:
-
RESOURCE_GROUP_NAME- группа ресурсов, в которой находится ваш профиль CDN. -
CDN_PROFILE_NAME- имя профиля CDN-сервиса, который вы хотите использовать. -
CDN_ENDPOINT_NAME- имя конечной точки, которую нужно очистить.
WAGTAILFRONTENDCACHE = {
'azure_cdn': {
'BACKEND': 'wagtail.contrib.frontend_cache.backends.AzureCdnBackend',
'RESOURCE_GROUP_NAME': 'MY-WAGTAIL-RESOURCE-GROUP',
'CDN_PROFILE_NAME': 'wagtailio',
'CDN_ENDPOINT_NAME': 'wagtailio-cdn-endpoint-123',
},
}
По умолчанию учетные данные будут использовать azure.identity.DefaultAzureCredential. Для изменения используемого объекта учетных данных используйте настройку CREDENTIALS. Подробную информацию об опциях см. в документации Azure.
from azure.common.credentials import ServicePrincipalCredentials
WAGTAILFRONTENDCACHE = {
'azure_cdn': {
'BACKEND': 'wagtail.contrib.frontend_cache.backends.AzureCdnBackend',
'RESOURCE_GROUP_NAME': 'MY-WAGTAIL-RESOURCE-GROUP',
'CDN_PROFILE_NAME': 'wagtailio',
'CDN_ENDPOINT_NAME': 'wagtailio-cdn-endpoint-123',
'CREDENTIALS': ServicePrincipalCredentials(
client_id='your client id',
secret='your client secret',
)
},
}
Еще одна опция, которую можно установить, это SUBSCRIPTION_ID. По умолчанию используется первая встреченная подписка, но если ваши учетные данные имеют доступ к нескольким подпискам, вы должны установить это значение явно.
Azure Front Door
С Azure Front Door вам понадобится экземпляр Front Door с включенным кэшированием.
Внешние зависимости этого бэкенда:
Пакет PyPI | Необходим | Причина |
|---|---|---|
Да | Взаимодействие с сервисом Front Door. | |
Нет | Получение учетных данных. Это необязательно, если вы хотите указать свои собственные учетные данные, используя настройку | |
Нет | Для получения идентификатора подписки. Избыточно, если вы хотите явно указать настройку |
Добавьте запись в WAGTAILFRONTENDCACHE и установите параметр BACKEND в значение wagtail.contrib.frontend_cache.backends.AzureFrontDoorBackend. Для этого бэкенда необходимо установить следующие настройки:
-
RESOURCE_GROUP_NAME- группа ресурсов, к которой принадлежит ваш экземпляр Front Door. -
FRONT_DOOR_NAME- имя вашего экземпляра Front Door.
WAGTAILFRONTENDCACHE = {
'azure_front_door': {
'BACKEND': 'wagtail.contrib.frontend_cache.backends.AzureFrontDoorBackend',
'RESOURCE_GROUP_NAME': 'MY-WAGTAIL-RESOURCE-GROUP',
'FRONT_DOOR_NAME': 'wagtail-io-front-door',
},
}
По умолчанию учетные данные будут использовать azure.identity.DefaultAzureCredential. Для изменения используемого объекта учетных данных используйте настройку CREDENTIALS. Подробную информацию об опциях см. в документации Azure.
from azure.common.credentials import ServicePrincipalCredentials
WAGTAILFRONTENDCACHE = {
'azure_front_door': {
'BACKEND': 'wagtail.contrib.frontend_cache.backends.AzureFrontDoorBackend',
'RESOURCE_GROUP_NAME': 'MY-WAGTAIL-RESOURCE-GROUP',
'FRONT_DOOR_NAME': 'wagtail-io-front-door',
'CREDENTIALS': ServicePrincipalCredentials(
client_id='your client id',
secret='your client secret',
)
},
}
Еще одна опция, которую можно установить, это SUBSCRIPTION_ID. По умолчанию используется первая встреченная подписка, но если ваши учетные данные имеют доступ к нескольким подпискам, вы должны установить это значение явно.
Расширенное использование
Очистка более одного URL-адреса на страницу
По умолчанию Wagtail очищает только один URL-адрес на страницу. Если на вашей странице нужно очистить более одного URL-адреса, вам необходимо переопределить метод get_cached_paths на типе страницы.
class BlogIndexPage(Page):
def get_blog_items(self):
# This returns a Django paginator of blog items in this section
return Paginator(self.get_children().live().type(BlogPage), 10)
def get_cached_paths(self):
# Yield the main URL
yield '/'
# Yield one URL per page in the paginator to make sure all pages are purged
for page_number in range(1, self.get_blog_items().num_pages + 1):
yield '/?page=' + str(page_number)
Очистка страниц индекса
Страницы, на которых перечислены другие страницы (например, индекс блога), также могут потребовать очистки, чтобы любые изменения на странице блога также отображались в индексе (например, добавление, удаление или изменение заголовка/миниатюры записи блога).
Чтобы очистить эти страницы, нам нужен обработчик сигналов, который прослушивает сигналы Wagtail page_published и page_unpublished для страниц блога (обратите внимание, что page_published вызывается как при создании, так и при обновлении страницы). Этот обработчик сигналов будет запускать очистку страницы индекса с помощью класса PurgeBatch, который используется для создания и отправки запросов на очистку.
# models.py
from django.dispatch import receiver
from django.db.models.signals import pre_delete
from wagtail.signals import page_published
from wagtail.contrib.frontend_cache.utils import PurgeBatch
...
def blog_page_changed(blog_page):
# Find all the live BlogIndexPages that contain this blog_page
batch = PurgeBatch()
for blog_index in BlogIndexPage.objects.live():
if blog_page in blog_index.get_blog_items().object_list:
batch.add_page(blog_index)
# Purge all the blog indexes we found in a single request
batch.purge()
@receiver(page_published, sender=BlogPage)
def blog_published_handler(instance, **kwargs):
blog_page_changed(instance)
@receiver(pre_delete, sender=BlogPage)
def blog_deleted_handler(instance, **kwargs):
blog_page_changed(instance)
Очистка URL-адресов
Класс PurgeBatch предоставляет методы .add_url(url) и .add_urls(urls) для добавления отдельных URL-адресов в пакет очистки.
Например, это может быть полезно для очистки одной страницы в индексе блога:
from wagtail.contrib.frontend_cache.utils import PurgeBatch # Purge the first page of the blog index batch = PurgeBatch() batch.add_url(blog_index.url + '?page=1') batch.purge()
Класс PurgeBatch
Ниже перечислены все доступные методы класса PurgeBatch.
© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/v3.0.3/reference/contrib/frontendcache.html