我正在使用其他人的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变量中的更改。
有什么想法吗?
答案 0 :(得分:0)
使用{% cache %}
标记仅缓存与用户无关的页面部分。
答案 1 :(得分:0)
修改Vary
标头,django将生成新的缓存密钥。
更新:我认为你应该选择cookie方法,因为SessionMiddleware
已经设置了相应的Vary标头,这就是为什么使用Auth,缓存正常工作。
因为你只想设置一次,所以我认为cookie方法是可行的。
无论哪个视图处理API方法的登录,都应该设置一个cookie,它是用户令牌的安全散列,如果我的想法是正确的话,其余的应该有效。