我最近在我的Django应用程序中使用memcached实现了整站缓存,我将TTL设置为大约500秒,并在Web应用程序的其他部分实现了每个视图缓存。问题是,当用户注销时,由于它是一个表单提交,网站的行为符合预期,但是如果他们然后去到受密码保护的网站部分,应用程序的行为会像他们仍然登录一样,除非他们点击“刷新”。 我对缓存不熟悉,想知道是否有任何聪明的方法可以防止这种情况?
我也遇到过类似的问题。标准的Django方法是为已认证的用户禁用缓存。 #settings.py CACHE_MIDDLEWARE_ANONYMOUS_ONLY=True 如果不同的用户看到不同的页面(例如:页面上显示他们的用户名),并且您不能为他们提供一个版本,则可以正常运行。但是,如果只有两个页面版本:针对已验证用户和其他用户,则完全禁用已验证用户的缓存不是一个好选择。我写了一个应用程序,除此之外,还可以在这种情况下微调缓存。更新。顺便说一句:您提到当单击“刷新”时会收到正确版本的页面。 这意味着问题出现在客户端缓存(Expires标头或E-tag)中,而不是服务器缓存中。要防止客户端缓存(如果您在同一URL下有多个页面版本),请使用@cache_control(must_revalidate=True)装饰器。
在查看站点的密码保护部分时,您是否会在获取数据(并可能从缓存中获取数据)之前检查用户是否已注册或匿名?您应该这样做。Django可以帮助您,在视图上放置一个需要登录的装饰器。 请看这个: http://docs.djangoproject.com/en/dev/topics/auth/#the-login-required-decorator