Кэширование фрагментов шаблона не работает для некоторых пользовательских тегов - PullRequest
3 голосов
/ 26 октября 2009

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

{% load cache %}
{% cache 500 request.user.username %}
{% load third party custom tags %}
{% expensive custom tag set that gets stuff from a third party server via xml %}
{{ some.stuff}}
{% endcache %}

Проблема не в том, что я делаю, запросы по-прежнему отправляются на этот удаленный сервер, кажется, Django не любит кешировать эти пользовательские теги шаблонов. Я знаю, что memcached работает отлично, для других представлений и шаблонов все работает просто отлично. Я делаю что-то, что несовместимо с кэшированием фрагмента? Есть ли способ обойти это?

Ответы [ 4 ]

3 голосов
/ 05 ноября 2009

Если фрагмент шаблона, который вы пытаетесь кэшировать, не может быть обработан, memcached не сможет его сохранить и вызовет исключение. Из того, что я могу извлечь, исключения, генерируемые при рендеринге шаблонов Django, подавляются. Поскольку ваш пользовательский тег выполняет HTTP-запросы, возможно, объекты сокетов (которые не могут быть обработаны) каким-то образом сохраняются во фрагменте шаблона.

Если это так, то единственный способ обойти это - изменить пользовательский тег, чтобы избавиться от любых оставшихся объектов сокетов.

0 голосов
/ 31 октября 2009

Я думаю, что проблема в пользовательском теге, как вы предложили.

Я не согласен с тем, что request.user.username является проблемой, так как документация по теме фактически приводит это в качестве примера, и я использовал его с внутренним кэшированием (например, числом постов), в тестировании и все работало нормально.

Кэш низкого уровня потенциально полезен, но я бы посмотрел на ваш пользовательский тег, чтобы увидеть, что не будет кэшироваться. Без кода трудно угадать, но я думаю, что будет возвращаться что-то вроде времени или какой-то другой переменной, которая заставляет его инициировать обновление (если XML извлекает какие-либо данные, которые изменяют, Django может вызвать обновление, в зависимости от на других настройках). У меня были смешанные результаты с кэшированием Django, поэтому я хотел бы взглянуть на ваши фиды XML, чтобы узнать, не вызывает ли это что-то, что прекращает кэширование.

0 голосов
/ 04 ноября 2009

Не думаю, что это как-то связано с пользовательским тегом.

В итоге мы переписали кеширующий тег Django, потому что нам нужно было больше контроля, чем было возможно с тем, который был предоставлен. Вы можете сделать его копию самостоятельно и вставить в него некоторые отладочные операторы печати. В частности, проверьте имя файла (если вы кэшируете файлы) и посмотрите, что генерируется. Может случиться так, что он меняется, когда не должен (по неизвестной причине), и это будет означать, что ему всегда нужно повторно визуализировать закрытый блок.

Посмотрите в django / templatetags / cache.py. Это всего 63 строки кода.

0 голосов
/ 31 октября 2009

Вы пытались использовать другое имя для фрагмента кэша? Может быть проблема с использованием request.user.username по нескольким причинам:

  • Если пользователь не вошел в систему, request.user.username может быть пустым, в результате чего безымянный кеш фрагмент

  • Если пользователь вошел в систему, это будет вызвать сторонний тег шаблона на минимум один раз для каждого пользователя каждые 3 * 1009 минуты зарядки *

Может быть, стоит попробовать переименовать имя фрагмента кеша для проверки:

{% cache 500 customxml %}

Я бы также попытался загрузить сторонний тег шаблона вне тега кеша так:

{% load cache third_party_custom_tags %}
{% cache 500 request.user.username %}
{% expensive custom tag set that gets stuff from a third party server via xml %}
{{ some.stuff}}
{% endcache %}

В чем я не уверен, так это в том, что инфраструктура кэша кэширует результаты тега шаблона. Если это не сработает, я бы посмотрел на то, что делает тег шаблона под капотом, и заново реализовал тег шаблона, используя низкоуровневый кеш Django .

...