使用Django进行网站全局缓存 - 在注销时存在密码保护页面的问题

5
我最近在我的Django应用程序中使用memcached实现了整站缓存,我将TTL设置为大约500秒,并在Web应用程序的其他部分实现了每个视图缓存。
问题是,当用户注销时,由于它是一个表单提交,网站的行为符合预期,但是如果他们然后去到受密码保护的网站部分,应用程序的行为会像他们仍然登录一样,除非他们点击“刷新”。 我对缓存不熟悉,想知道是否有任何聪明的方法可以防止这种情况?
2个回答

7

我也遇到过类似的问题。标准的Django方法是为已认证的用户禁用缓存。

#settings.py
CACHE_MIDDLEWARE_ANONYMOUS_ONLY=True

如果不同的用户看到不同的页面(例如:页面上显示他们的用户名),并且您不能为他们提供一个版本,则可以正常运行。但是,如果只有两个页面版本:针对已验证用户和其他用户,则完全禁用已验证用户的缓存不是一个好选择。我写了一个应用程序,除此之外,还可以在这种情况下微调缓存。
更新。
顺便说一句:您提到当单击“刷新”时会收到正确版本的页面。 这意味着问题出现在客户端缓存(Expires标头或E-tag)中,而不是服务器缓存中。
要防止客户端缓存(如果您在同一URL下有多个页面版本),请使用@cache_control(must_revalidate=True)装饰器。

出于好奇,如果我有三个版本而不是两个版本,您的应用程序是否可以正常工作?(匿名、已认证、员工)? - Powerlord
可以根据请求中的任何内容使用它来拥有不同版本的页面。这意味着您可以拥有按用户缓存的页面或按用户属性缓存的页面或按cookie缓存的页面。 - Mikhail Korobov
..或者通过GET参数缓存的页面 - Mikhail Korobov
这看起来非常有趣,谢谢Mike,这给了我很多东西可以研究。 - Tristan Brotherton

1

是的,我确实这样做了,所有内容都需要登录装饰器,问题在于登录状态被缓存了。 - Tristan Brotherton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接