Переменные сеанса с кэшированными страницами в Django - PullRequest
0 голосов
/ 04 апреля 2011

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

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

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

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

CACHE_BACKEND = 'file: ///..../cache/'

И использование команды @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.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 04 апреля 2011

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

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

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

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

0 голосов
/ 04 апреля 2011

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

...