Django全站缓存 - 登出时密码保护页面的问题

5 投票
2 回答
843 浏览
提问于 2025-04-15 15:17

我最近在我的Django应用程序中实现了全站缓存,使用的是memcached。我把TTL(生存时间)设置为大约500秒,并在网站的其他部分实现了按页面缓存。

我遇到的问题是,当用户注销时,网站的表现是正常的,因为这是一个表单提交。但是如果他们随后访问一个需要密码保护的页面,应用程序却表现得好像他们仍然登录着,除非他们点击“刷新”。我对缓存还不太熟悉,想知道有没有什么聪明的方法可以防止这种情况发生?

2 个回答

1

在网站的一个需要密码保护的部分,你是否在获取数据之前检查用户是注册用户还是匿名用户(也许还会从缓存中获取数据)?

你应该这样做。Django可以帮助你,通过一个叫做“登录必需”的装饰器,你可以把它放在视图上。看看这个链接:

http://docs.djangoproject.com/en/dev/topics/auth/#the-login-required-decorator

7

我遇到过类似的问题。标准的Django做法是对已登录的用户禁用缓存。

#settings.py
CACHE_MIDDLEWARE_ANONYMOUS_ONLY=True

如果不同的用户看到不同的页面(比如:页面上有他们的用户名),那这样做是没问题的,因为你不能给他们提供同一个版本的页面。

但是如果页面只有两个版本:一个是给已登录用户的,另一个是给其他用户的,那完全禁用已登录用户的缓存就不太合适了。我写了一个应用,它可以在这种情况下帮助你更好地调整缓存。

更新。

顺便提一下:你提到当你点击“刷新”时,能正确获取到页面的版本。这说明问题出在客户端的缓存(比如:过期头或E-tag),而不是服务器的缓存。

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

撰写回答