2009-10-22 23 views
5

我最近在我的Django应用程序上使用memcached实现了网站范围的缓存,我已将TTL设置为约500秒,并在其他部分实现了每个视图缓存Web应用程序。用Django进行全网缓存 - 注销时出现密码保护页面的问题

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

回答

7

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

#settings.py 
CACHE_MIDDLEWARE_ANONYMOUS_ONLY=True 

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

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

更新。

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

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

+0

出于好奇,如果我有3个版本而不是2个,你的应用程序是否工作? (匿名,身份验证,工作人员)? – Powerlord 2009-10-22 19:25:36

+0

是的。它可以用来根据请求中的任何内容拥有不同版本的页面。这意味着您可以让每个用户的缓存页面或页面通过用户的属性缓存或缓存Cookie。 – 2009-10-22 19:32:58

+0

..或通过GET参数缓存页面 – 2009-10-22 19:33:28

1

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

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

+0

是的,我这样做,一切都有一个登录所需的装饰器,问题是登录状态被缓存。 – 2009-10-22 17:10:49

+0

但它清楚如果你点击“刷新”。 – 2009-10-22 17:11:29