Django中缓存页面的会话变量

时间:2011-04-03 21:27:41

标签: python django caching session-variables

我正在使用其他人的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 :(得分:0)

使用{% cache %}标记仅缓存与用户无关的页面部分。

答案 1 :(得分:0)

修改Vary标头,django将生成新的缓存密钥。

更新:我认为你应该选择cookie方法,因为SessionMiddleware已经设置了相应的Vary标头,这就是为什么使用Auth,缓存正常工作。

因为你只想设置一次,所以我认为cookie方法是可行的。

无论哪个视图处理API方法的登录,都应该设置一个cookie,它是用户令牌的安全散列,如果我的想法是正确的话,其余的应该有效。