2011-04-03 64 views
0

我使用允许用户浏览其网站内容的其他人的API来构建应用程序。用户可以使用其他站点的凭证登录我的项目,以便从他们的站点“收藏”内容。在Django中使用缓存页面的会话变量

当他们登录时,我得到了一个user_token。为了避免为他们创造一个用户文件,我只是此令牌保存为一个会话变量:

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

我还使用文件缓存从网站内容:

CACHE_BACKEND =“文件:///..../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变量中的更改。

任何想法?

回答

0

修改Vary标题,django将生成一个新的缓存键。

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

既然你只想设置一次,cookie方法是我想的方式。

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

0

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