Переменные сеанса с кэшированными страницами в Django

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

Когда они входят в систему, я получаю для них user_token. Чтобы не создавать для них пользовательский файл, я просто сохраняю этот токен как переменную сеанса:

# Set session
request.session.set_expiry(60 * 60)
# Save token in session
request.session['user_token'] = unicode(auth.Message)

Я также использую кэширование файлов для контента с сайта:

CACHE_BACKEND = 'файл:///..../кеш/'

И используя команду @cache_page перед определенными представлениями для кэширования данных:

@cache_page(CACHE_TIME)
def listings_by_cat_page(request, category_id):
    # view stuff here

Проблема, с которой я сталкиваюсь, заключается в том, что когда пользователь просматривает главный экран (который кэшируется), нажимает «Войти», входит в систему, а затем возвращается на главный экран, кнопка «Вход/выход» не знает, что нужно переключать. Я предполагаю, что это потому, что, поскольку это кешированная страница, она не видит переменную сеанса user_token.

{% if not request.session.user_token %}
    <a href="/login{% comment %}?next={{ request.path }}{% endcomment %}" class="login">Login</a>
{% else %}
    <a href="/logout/" class="login">Logout</a>
{% endif %}

В идеале я хотел бы кэшировать содержимое, но чтобы страница распознавала изменение в переменных request.session.

Любые идеи?


person Brenden    schedule 03.04.2011    source источник


Ответы (2)


Измените заголовок Vary, и django сгенерирует новый ключ кэша.

Обновление: я думаю, вам следует использовать метод cookie, поскольку SessionMiddleware уже устанавливает соответствующие заголовки Vary, поэтому с Auth кэширование работает правильно.

Поскольку вы хотите установить это только один раз, я думаю, что метод cookie - это то, что вам нужно.

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

person Yuji 'Tomita' Tomita    schedule 03.04.2011

используйте тег {% cache %} для кэширования только тех частей страницы, которые не зависят от пользователя.

person Jerzyk    schedule 03.04.2011