Django: как обрабатывать кеширование в представлениях, которые отличаются для запросов Ajax?

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

Я настроил memcached, но в моих представлениях есть следующая архитектура, позволяющая моему приложению использовать Ajax во внешнем интерфейсе:

@cache_page(60 * 60 * 12)
def items(request, pattern=None, specialurl=None):
  if request.is_ajax():
    template = "result_ajax.html"
  else: 
    template = "index.html"

.. и, к сожалению, комбинация кэширования и специальной обработки Ajax-вызовов не работает.

Это связано с тем, что memcached не различает результаты Ajax и результаты, отличные от Ajax, поэтому вызовы Ajax из внешнего интерфейса получают кэшированные результаты, отличные от Ajax, и наоборот.

Итак, что мне нужно сделать, это выяснить, как еще кешировать. Могу предположить следующие варианты:

  1. Кэшируйте только запросы к базе данных на срок до одного дня. Это возможно?
  2. Кэшируйте фрагмент шаблона в result_ajax.html, который фактически отображает результаты. (index.html на самом деле включает result_ajax.html.)

Какой из них, вероятно, будет лучшим способом сделать что-то?


person Richard    schedule 14.06.2013    source источник


Ответы (1)


Я бы попробовал что-то вроде этого, чтобы сказать декоратору кеша использовать другой ключ кеша для запросов Ajax и не-Ajax:

from django.views.decorators.cache import cache_page
from django.views.decorators.vary import vary_on_headers

@cache_page(60 * 60 * 12)
@vary_on_headers('X-Requested-With')
def items(request, pattern=None, specialurl=None):
  if request.is_ajax():
    template = "result_ajax.html"
  else: 
    template = "index.html"
person Nicolas Cortot    schedule 17.06.2013
comment
Не знал, что такое возможно - спасибо за предложение! - person Richard; 18.06.2013