使用Django进行站点范围缓存 - 注销时受密码保护的页面出现问题

时间:2009-10-22 16:47:13

标签: python django memcached

我最近在我的Django应用程序上使用memcached实现了全站点缓存,我将TTL设置为大约500秒,并在Web应用程序的其他部分实现每个视图缓存。 / p>

我遇到的问题是,当用户注销时,因为它是表单帖子,网站的行为符合预期,但是如果他们然后转到站点的密码保护部分,则应用程序的行为就像他们仍然登录一样,除非他们点击“刷新”。 我刚接触缓存,并想知道我是否可以做任何聪明的事情来防止这种情况发生?

2 个答案:

答案 0 :(得分:7)

我遇到了类似的问题。标准的Django方法是为经过身份验证的用户禁用缓存。

#settings.py
CACHE_MIDDLEWARE_ANONYMOUS_ONLY=True

如果不同的用户看到不同的页面(例如:他们的用户名)并且你不能拥有一个版本,它可以正常工作。

但是,如果页面只有2个版本:对于经过身份验证的用户和其他用户,则完全禁用经过身份验证的用户的缓存并不好。我写了一个app,除此之外,还可以在这种情况下微调缓存。

更新

顺便说一句:您提到当您点击“刷新”时,会收到正确版本的页面。这意味着问题是客户端缓存(Expires头或E-tag),而不是服务器缓存。

要防止客户端缓存(如果您在同一网址下有多个版本的页面,则必须这样做)使用@cache_control(must_revalidate=True)装饰器。

答案 1 :(得分:1)

在网站受密码保护的部分视图中,您是否在获取数据之前检查用户是注册的还是匿名的(并且可能从缓存中提取数据)?

你应该。 Django帮助您,您可以在视图上放置需要登录的装饰器。 看看这个: http://docs.djangoproject.com/en/dev/topics/auth/#the-login-required-decorator