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 = '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 %}
理想情况下,我希望能够缓存内容,同时让页面识别请求中的session变量的变化。
有没有什么好的想法?
2 个回答
0
使用 {% cache %}
标签来缓存页面中那些不依赖于用户的部分。
0
修改一下 Vary
这个头信息,django 就会生成一个新的缓存键。
更新一下:我觉得你应该使用 cookie 的方法,因为 SessionMiddleware
已经设置了合适的 Vary 头信息,这就是为什么在使用身份验证时,缓存能够正常工作的原因。
因为你只想设置一次,所以我认为使用 cookie 方法是最合适的。
处理 API 登录的视图应该设置一个 cookie,这个 cookie 是用户令牌的安全哈希,其他的应该就能正常工作,如果我没想错的话。