Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Django进行站点范围的缓存-注销时受密码保护的页面出现问题_Python_Django_Memcached - Fatal编程技术网

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

Python 使用Django进行站点范围的缓存-注销时受密码保护的页面出现问题,python,django,memcached,Python,Django,Memcached,我最近在Django应用程序上使用实现了站点范围的缓存,我将设置为大约500秒,并在web应用程序的其他部分实现了按视图缓存 我遇到的问题是,当用户注销时,因为这是一个表单帖子,所以站点的行为与预期的一样,但是如果他们转到站点中受密码保护的部分,应用程序的行为就好像他们仍然登录一样,除非他们点击“刷新”。 我不熟悉缓存,想知道我是否可以做些聪明的事情来防止这种情况发生?在站点中受密码保护的部分,在获取数据(或者从缓存中获取数据)之前,您是否检查用户是否已注册或匿名 你应该。Django为您提供了

我最近在Django应用程序上使用实现了站点范围的缓存,我将设置为大约500秒,并在web应用程序的其他部分实现了按视图缓存

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

在站点中受密码保护的部分,在获取数据(或者从缓存中获取数据)之前,您是否检查用户是否已注册或匿名

你应该。Django为您提供了一个登录所需的装饰器,您可以将其放置在视图上。 看看这个:
我遇到了类似的问题。标准的Django方法是为经过身份验证的用户禁用缓存

#settings.py
CACHE_MIDDLEWARE_ANONYMOUS_ONLY=True
如果不同的用户看到不同的页面(例如:他们的用户名在页面上),并且您不能为他们提供一个版本,那么它就可以正常工作

但是,如果页面只有两个版本:对于经过身份验证的用户和其他用户,那么完全禁用经过身份验证的用户的缓存是不好的。除此之外,我还写了一篇文章,使得在这种情况下对缓存进行微调成为可能

更新

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


要防止客户端缓存(如果在同一URL下有多个版本的页面,则必须这样做),请使用
@cache\u control(must\u revalidate=True)
decorator。

是的,我这样做了,所有内容都有一个登录所需的decorator,问题是登录状态被缓存。出于好奇,如果我有三个版本而不是两个版本,你的应用程序能工作吗?(匿名、认证、员工)?是的。它可以用于根据请求中的任何内容生成不同版本的页面。这意味着您可以按用户缓存页面,或按用户属性缓存页面,或按Cookie缓存页面。。。或者GET参数缓存的页面这看起来真的很有趣,谢谢Mike,这让我有很多东西要研究。