Кэширование всего сайта с Django - проблемы с защищенными паролем страницами при выходе из системы

Недавно я реализовал кеширование всего сайта с помощью memcached в своем приложении Django, я установил < href="http://en.wikipedia.org/wiki/Time_to_live" rel="nofollow noreferrer">TTL примерно до 500 секунд, а также реализовать кеширование для каждого просмотра в других частях веб-приложения.

Проблема, с которой я сталкиваюсь, заключается в том, что когда пользователь выходит из системы, поскольку это сообщение формы, сайт ведет себя так, как ожидалось, однако, если они затем переходят в защищенную паролем часть сайта, приложение ведет себя так, как если бы они все еще вошли в систему, если только они нажмите «обновить». Я новичок в кэшировании, и мне интересно, могу ли я сделать что-нибудь умное, чтобы предотвратить это?


person Tristan Brotherton    schedule 22.10.2009    source источник


Ответы (2)


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

#settings.py
CACHE_MIDDLEWARE_ANONYMOUS_ONLY=True

Он отлично работает, если разные пользователи видят разные страницы (например, их имя пользователя на них), и у вас не может быть одной версии для них.

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

Обновлять.

Кстати: вы упомянули, что при нажатии кнопки «Обновить» будет получена правильная версия страницы. Это означает, что проблема заключается в кеше на стороне клиента (заголовок Expires или E-tag), а не в кеше сервера.

Чтобы предотвратить кеширование на стороне клиента (вы должны сделать это, если у вас есть несколько версий страницы с одним и тем же URL-адресом), используйте декоратор @cache_control(must_revalidate=True).

person Mikhail Korobov    schedule 22.10.2009
comment
Из любопытства, ваше приложение работает, если у меня 3 версии, а не две? (Анонимный, Аутентифицированный, Персонал)? - person Powerlord; 22.10.2009
comment
Да. Его можно использовать для создания разных версий страниц в зависимости от запроса. Это означает, что у вас могут быть кэшированные страницы для каждого пользователя или страницы, кэшированные по атрибуту пользователя, или страницы, кэшированные с помощью файлов cookie. - person Mikhail Korobov; 22.10.2009
comment
.. или страницы, кэшированные по параметрам GET - person Mikhail Korobov; 22.10.2009
comment
Это выглядит действительно интересно, спасибо, Майк, это дало мне много материала для изучения. - person Tristan Brotherton; 23.10.2009

С точки зрения защищенной паролем части сайта, проверяете ли вы, зарегистрирован ли пользователь или анонимен, прежде чем извлекать данные (и, возможно, извлекать данные из кеша)?

Вам следует. Django поможет вам с помощью декоратора, необходимого для входа в систему, который вы можете разместить в представлении. Взгляните на это: http://docs.djangoproject.com/en/dev/topics/auth/#the-login-required-decorator

person OmerGertel    schedule 22.10.2009
comment
Да, я делаю это, у всего есть декоратор, требующий входа в систему, проблема в том, что состояние входа в систему кэшируется. - person Tristan Brotherton; 22.10.2009