Могу ли я заставить кеш сайта Django использовать в качестве ключа только путь к каждой странице?
Я разработал сайт Django. Между экземплярами моделей в базе данных и страницами на сайте существует соотношение 1: 1.
Я хотел бы кэшировать каждую страницу на сайте (используя memcached в качестве фоновой части кэша). Сайт не так уж велик - согласно подсчетам с обратной стороны конверта, все это должно уместиться в довольно небольшой объем ОЗУ - и данные не изменяются особенно часто, поэтому весь сайт может эффективно функционировать в кеше.
Однако, когда данные действительно меняются, я хочу, чтобы кеш отражал это немедленно, поэтому в идеале я бы хотел, чтобы каждый экземпляр модели мог очистить свою страницу из кеша при сохранении.
То, как я себе это представлял, - это кэширование страниц с их URL-адресом в качестве ключа. Тогда каждый экземпляр модели может использовать свой URL (который он знает через get_absolue_url()
) очистить свою страницу из кеша.
Можно ли заставить механизм кэширования Django для каждого сайта использовать URL-адреса страниц в качестве ключа кэширования?
1 ответ
Я не знаю ни одного варианта управления ключом кеша, и реализация в Django не предполагает, что он есть. Код для генерации ключа кеша для запроса через промежуточное ПО кеша живет в django.utils.cache.get_cache_key
(чтобы узнать, где взять из кеша) и learn_cache_key
(чтобы знать, где установить кэш). Вы могли бы пропатчить эти функции, чтобы не учитывать заголовки следующим образом:
from django.utils import cache
from django.conf import settings
def get_path_cache_key(request, key_prefix=None):
if key_prefix is None:
key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
return cache._generate_cache_key(request, [], key_prefix)
# passing an empty headerlist so only request.path is taken into account
cache.get_cache_key = get_path_cache_key
cache.learn_cache_key = get_path_cache_key
Это внутренне примет MD5-хэш пути, добавит потенциальный префикс, а также примет во внимание текущую локаль (язык). Вы можете изменить его, чтобы пропустить префикс и язык. Я бы не рекомендовал использовать простой путь без хэширования, так как memcached не разрешает ключи длиной более 250 символов или содержащие пробелы, согласно документации. Это не должно быть проблемой, потому что вы можете просто подать заявку get_path_cache_key
на URL от get_absolute_url()
а также и очистить эту страницу.