在Django中使用缓存页面的会话变量
问题描述:
我使用允许用户浏览其网站内容的其他人的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变量中的更改。
任何想法?
答
修改Vary
标题,django将生成一个新的缓存键。
更新:我认为你应该去cookie方法,因为SessionMiddleware
已经设置了适当的Vary头,这就是为什么使用Auth,缓存工作正常。
既然你只想设置一次,cookie方法是我想的方式。
无论哪个视图处理API方法的登录,都应该设置一个cookie,它是用户令牌的安全哈希,其余的应该可以工作,如果我的想法是正确的话。
答
使用{% cache %}
标记来仅缓存与用户无关的部分页面。