Django中缓存页面的会话变量

0 投票
2 回答
1036 浏览
提问于 2025-04-16 15:01

我正在开发一个应用程序,使用别人的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 是用户令牌的安全哈希,其他的应该就能正常工作,如果我没想错的话。

撰写回答