2013-06-14 1 views
2

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

Я настроил 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 не работает.

Это beacuse memcached не различает результаты Ajax и результаты без Ajax - поэтому Ajax-вызовы из front-end получают кэшированные результаты без Ajax и наоборот.

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

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

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

ответ

4

Я хотел бы попробовать что-то вроде этого сказать декоратор кэша использовать другой ключ кэша для 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" 
+0

понятия не имел, что это было возможно - спасибо за предложение! – Richard