Как отключить кеширование страниц в Django / mod_WSGI - PullRequest
9 голосов
/ 28 октября 2009

У меня Django работает в Apache через mod_wsgi. Я считаю, что Django кэширует мои страницы на стороне сервера, что приводит к неправильной работе некоторых функций.

У меня есть таймер обратного отсчета, который работает, получая текущее время сервера, определяя оставшееся время обратного отсчета и выводя это число в шаблон HTML. Таймер обратного отсчета JavaScript затем вступает во владение и запускает обратный отсчет для пользователя.

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

Используя HTTPFox, страница не загружается из кеша моего браузера, поэтому похоже, что Django или Apache кэшируют страницу. Есть ли способ отключить эту функцию? У меня не будет достаточно трафика, чтобы беспокоиться о кэшировании выходных данных скрипта. Или я совершенно не прав, почему это происходит?

[Редактировать] Из постов ниже, похоже, что кэширование отключено в Django, что означает, что это должно происходить в другом месте, возможно, в Apache?

[Редактировать] У меня есть более подробное описание того, что происходит: для первых 7 (или около того) запросов к серверу страницы обрабатываются сценарием и возвращаются, хотя каждая из этих 7 страниц кажется кэшируется, как это показано позже. По восьмому запросу сервер обслуживает первую страницу. По 9-му запросу он обслуживает вторую страницу и так далее в цикле. Это продолжается до тех пор, пока я не перезапущу apache, когда процесс начнется снова.

[Edit] Я настроил mod_wsgi для запуска только одного процесса за раз, что приводит к сбросу таймера к одному и тому же значению в каждом случае. Интересно, что на моей странице есть еще один компонент, который отображает случайное изображение при каждом запросе, используя порядок ('?'), И каждый раз обновляется различными изображениями, что указывает на то, что кэширование происходит в Django, а не в Apache.

[Правка] В свете предыдущего редактирования я вернулся и просмотрел соответствующий файл views.py и обнаружил, что переменная начала обратного отсчета задается глобально в модуле, вне функций представления. Перемещение этого параметра в функции просмотра решило проблему. Так что, в конце концов, проблема с кэшированием не возникла. Спасибо всем за помощь в этом.

Ответы [ 4 ]

6 голосов
/ 28 октября 2009

Из моего опыта работы с mod_wsgi в Apache очень маловероятно, что они вызывают кеширование. Несколько вещей, чтобы попробовать:

  1. Возможно, у вас есть какой-то прокси-сервер между вашим компьютером и веб-сервером, который надлежащим образом или неадекватно кэширует страницы. Иногда интернет-провайдеры используют прокси-серверы для уменьшения пропускной способности за пределами своей сети. Не могли бы вы предоставить HTTP-заголовки для страницы, которая кэшируется (Firebug может предоставить их вам). Заголовки, которые меня особенно интересуют, включают Cache-Control, Expires, Last-Modified и ETag.
  2. Можете ли вы опубликовать свой MIDDLEWARE_CLASSES из файла settings.py. Возможно, у вас есть Middleware, который выполняет кеширование для вас.
  3. Можете ли вы выполнить поиск кода для следующих элементов: «загрузить кеш», «django.core.cache» и «cache_page». * Grep -R "search" ** будет работать.
  4. Включает ли файл settings.py (или что-либо, что он импортирует, например, "из локальных настроек импорта *") CACHE_BACKEND?
  5. Что происходит, когда вы перезапускаете apache? (например, перезапуск apache служб sudo). Если перезапуск устраняет проблему, то это может быть apache, выполняющий кеширование (возможно, это также может очистить серверную часть кеша Django)
2 голосов
/ 26 мая 2013

Я только что сталкивался с этим:

Поддержка автоматической перезагрузки. активировать поддержку автоматической перезагрузки. Всякий раз, когда что-то меняется файл .wsgi, mod_wsgi перезагрузит все процессы демона для нас.

Для этого просто добавьте следующую директиву в раздел вашего каталога:

WSGIScriptReloading On
1 голос
/ 28 октября 2009

Используете ли вы многопроцессную конфигурацию для Apache / mod_wsgi? Если да, это будет объяснять, почему разные ответы могут иметь разное значение для таймера, так как вероятность того, что при инициализации таймера, будет отличаться для каждого процесса, обрабатывающего запросы. Итак, почему он может прыгать вокруг.

Прочитайте:

http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading

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

1 голос
/ 28 октября 2009

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

http://docs.djangoproject.com/en/dev/topics/cache/

...