Как кешировать результат запроса в django? - PullRequest
9 голосов
/ 27 сентября 2010

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

def cacheView():
  result = cache.get('key')
  if result is None:
    result = Model.objects.get(id=1)
    cache.set('key', 'result')

Я вызываю этот метод, когда пользователь входит в систему. Однако, если я пытаюсь выйти из системы после входа в систему, он остается на той же странице, как если бы я все еще вошел в систему. Я пыталсяследовать документации Django по кешу на http://docs.djangoproject.com/en/1.2/topics/cache/, но безуспешно.

Еще одна вещь, которую я попробовал, заключается в том, что, если я попытаюсь использовать декоратор кеша чуть выше представления как:

@cache_control(max_age=1000)
def cacheView():
 ...

это выдает ошибку "заголовок ответа не определен".Я новичок в Django и уверен, что я что-то пропустил.Любая идея?

Ответы [ 2 ]

9 голосов
/ 27 сентября 2010

RTFM :) Официальные документы Django: Кэширование и наборы запросов

Каждый набор QuerySet содержит кэш для минимизации доступа к базе данных.(...)

и:

Во вновь созданном QuerySet кеш пуст.При первой оценке QuerySet - и, следовательно, при выполнении запроса к базе данных - Django сохраняет результаты запроса в кеше QuerySet и возвращает результаты, которые были явно запрошены (например, следующий элемент, если QuerySet итерируетсянад).Последующие оценки QuerySet повторно используют кэшированные результаты.

Кэширование выполняется автоматически в случае QuerySets (результаты запросов).

EDIT: Что касается вашегоКод вставлен в вопрос.Если ключ еще не существует в кеше, вы должны создать его с помощью метода add(), но помните, что он истекает по умолчанию через 30 секунд.Если вы хотите, чтобы он сохранялся дольше, вы должны добавить опцию тайм-аута к методу add()/set().

Если вы хотите кэшировать весь ваш сайт (т.е. декораторам, как вы их использовали), вам нужно добавитьсоответствующее промежуточное программное обеспечение для вашего MIDDLEWARE_CLASSES в settings.py (в этом точном порядке, поскольку порядок промежуточного программного обеспечения имеет значение, оно загружается по одному, как вы их определяете):

MIDDLEWARE_CLASSES = (
    # ...
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
    # ...
)

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

1 голос
/ 21 августа 2011

Из вашего примера неясно, почему выход из системы завершится неудачно, но это не должно быть связано с кэшированием модели (если вы не кэшируете модель User и не используете кэшированного пользователя для аутентификации вместо request.user? )

Хорошо использовать cache.get и cache.set так, как вы есть (set создаст новый ключ, если он не существует).

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

Посмотрите на эти библиотеки кэширования запросов для Django, которые призваны упростить задачу:

http://jbalogh.me/2010/02/09/cache-machine/

http://packages.python.org/johnny-cache/queryset_cache.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...