Spec-Zone.ru › Wagtail 2

Очистка кэша на стороне клиента

Многие веб-сайты используют кэш на стороне клиента, например, 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:

  • Varnish
  • Squid

Cloudflare

Сначала вам необходимо зарегистрировать учетную запись Cloudflare, если у вас её ещё нет. Вы можете сделать это здесь: Регистрация на Cloudflare

Добавьте запись в WAGTAILFRONTENDCACHE и установите параметр BACKEND в значение wagtail.contrib.frontend_cache.backends.CloudflareBackend.

Этот бэкэнд можно настроить для использования универсального API-ключа или API-токена с ограниченным доступом.

Для использования универсального API-ключа найдите ключ как описано в документации Cloudflare и укажите параметры EMAIL и API_KEY.

Для использования ограниченного API-токена создайте токен с разрешениями «Зона, Очистка кэша» и укажите параметр BEARER_TOKEN.

Необходимо установить параметр ZONEID для любого из вариантов. Чтобы найти ZONEID для вашего домена, обратитесь к документации Cloudflare API

С 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 (идентификатор распределения 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 Необходим Причина
azure-mgmt-cdn Да Взаимодействие с CDN-сервисом.
azure-identity Нет Получение учетных данных. Это необязательно, если вы хотите указать свои собственные учетные данные, используя настройку CREDENTIALS (подробнее ниже).
azure-mgmt-resource Нет Для получения идентификатора подписки. Избыточно, если вы хотите явно указать настройку SUBSCRIPTION_ID (подробнее ниже).

Добавьте запись в 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 Необходим Причина
azure-mgmt-frontdoor Да Взаимодействие с сервисом Front Door.
azure-identity Нет Получение учетных данных. Это необязательно, если вы хотите указать свои собственные учетные данные, используя настройку CREDENTIALS (подробнее ниже).
azure-mgmt-resource Нет Для получения идентификатора подписки. Избыточно, если вы хотите явно указать настройку SUBSCRIPTION_ID (подробнее ниже).

Добавьте запись в 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.core.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.

  • Предыдущая Генератор карты сайта
  • Следующая RoutablePageMixin

Содержание страницы

  • Очиститель кэша фронтенда
    • Настройка
      • Varnish/Squid
      • Cloudflare
      • Amazon CloudFront
      • Azure CDN
      • Azure Front Door
    • Расширенное использование
      • Очистка кэша более одного URL-адреса на странице
      • Очистка кэша страниц-индексов
      • Очистка кэша URL-адресов
      • Класс PurgeBatch

© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/v2.16.3/reference/contrib/frontendcache.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API