Очистка кэша на стороне клиента
Многие веб-сайты используют кэш на стороне клиента, такой как 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-адреса для каждого языка страницы, для которой выполняется очистка. Для работы этой настройки необходимо, чтобы 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/stable/reference/contrib/frontendcache.html