Могу ли я заставить кеш сайта Django использовать в качестве ключа только путь к каждой странице? - PullRequest
3 голосов
/ 14 декабря 2011

Я разработал сайт Django. Между экземплярами моделей в базе данных и страницами на сайте существует почти однозначное отношение.

Я бы хотел кэшировать каждую страницу на сайте (используя memcached в качестве фоновой части кэша). Сайт не так уж велик - согласно подсчетам с обратной стороны конверта, все это должно уместиться в довольно небольшой объем ОЗУ - и данные не изменяются особенно часто, поэтому весь сайт может эффективно функционировать в кеше.

Однако, когда данные действительно меняются, я хочу, чтобы кеш отражал это немедленно, поэтому в идеале мне бы хотелось, чтобы каждый экземпляр модели мог очищать свою собственную страницу из кеша при сохранении.

То, как я себе это представлял, - это кэширование страниц с их URL-адресом в качестве ключа. Затем каждый экземпляр модели может использовать свой URL (который он знает через get_absolue_url()), чтобы очистить свою страницу из кэша.

Можно ли заставить механизм кэширования Django для каждого сайта использовать URL-адреса страниц в качестве ключа кэширования?

1 Ответ

2 голосов
/ 16 декабря 2011

Я не знаю ни одной опции для управления ключом кэша, и реализация в 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() и очистить эту страницу.

...