Ошибка кеширования Django .. даже если кеширование отключено - PullRequest
4 голосов
/ 03 февраля 2011

У меня есть сайт Django, где происходит странная ошибка.

На сайте они могут добавлять «публикации», что по сути то же самое, что и запись в блоге под другим именем.

Все становится странным, когда они изменяют существующий пост. Сначала они изменяют его в админке, а когда заходят на сайт, изменения не видны. Например, если старая версия была кэширована.

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

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

Так что, если тело сообщения было «Привет, мир», и я изменил его на «Прощай, жестокий мир», а затем зашел на сайт и обновил страницу несколько раз, я бы увидел «Привет, мир», затем «До свидания». жестокий мир ", затем" Привет, мир "и так далее ... независимо от того, как долго я продолжаю это делать.

Но это не останавливается на достигнутом ... примерно через 24 часа все возвращается на круги своя и работает нормально. Перестановки больше нет, сайт придерживается новой версии ...

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

Я использую последнюю версию django (1.3) с БД MySQL, и кеширование не включено ..

Есть идеи?

Редактировать : изящный перезапуск Apache решает проблему ... но перезапуск apache после каждого обновления не самая лучшая вещь ..

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

Ответы [ 3 ]

6 голосов
/ 04 февраля 2011

Проблема явно решена в документации универсальных представлений .Наборы запросов в вашем словаре extra_context оцениваются один раз, когда urlconf обрабатывается впервые, и каждый раз после этого они продолжают использовать одни и те же значения.Вот почему они изменяются только после сброса Apache или сервера dev.

Решение, как описано на связанной странице, заключается в использовании вызываемых элементов, которые возвращают наборы запросов, вместо указания наборов запросов в самом словаре.

3 голосов
/ 03 февраля 2011

Однажды у меня была похожая проблема. Оказалось, что я создал объект в верхней части urls.py, и объект был жив до тех пор, пока процесс был жив. Возможно, вы используете глобальную переменную в одном из ваших представлений.

1 голос
/ 03 февраля 2011

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

Определить максимальное время кэширования страницы. Укажите, должен ли кэш всегда проверять наличие новых версий, доставляя кэшированное содержимое только при отсутствии изменений.( Некоторые кэши могут доставлять кэшированное содержимое, даже если страница сервера изменилась, просто потому, что срок действия копии кэша еще не истек . **)

В Django используйте декоратор представления cache_control, чтобы указатьэти параметры кэша.В этом примере cache_control сообщает кэшам о необходимости повторной проверки кэша при каждом доступе и хранения кэшированных версий не более 3 600 секунд:

from django.views.decorators.cache import cache_control

@cache_control(must_revalidate=True, max_age=3600)
def my_view(request):
    # ...

Любая действительная HTTP-директива Cache-Control действительна в cache_control ().Вот полный список:

public=True
private=True
no_cache=True
no_transform=True
must_revalidate=True
proxy_revalidate=True
max_age=num_seconds
s_maxage=num_seconds
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...