如何禁用Django / mod_WSGI页面缓存

时间:2009-10-27 21:08:11

标签: python django apache caching mod-wsgi

我通过mod_wsgi在Apache中运行Django。我相信Django正在缓存我的服务器端页面,这导致一些功能无法正常工作。

我有一个倒数计时器,它通过获取当前服务器时间,确定剩余倒计时时间,并将该数字输出到HTML模板来工作。然后,javascript倒计时器接管并运行用户的倒计时。

当用户刷新页面或使用倒数计时器导航到其他页面时,会出现问题。计时器似乎偶尔跳到不同的时间,通常在每次刷新时反复回到同一时间。

使用HTTPFox,页面没有从我的浏览器缓存中加载,所以看起来Django或Apache正在缓存页面。有没有办法禁用此功能?我不会有足够的流量来担心缓存脚本输出。或者我为什么会这样做完全错了?

[编辑]从下面的帖子看,在Django中看起来禁用了缓存,这意味着它必须在其他地方发生,也许在Apache中?

[编辑]我对发生的事情有了更全面的描述:对于服务器发出的前7个(或左右)请求,页面由脚本呈现并返回,尽管这7个页面中的每一个似乎都是缓存,因为它稍后出现。在第8个请求中,服务器提供第一页。在第9个请求中,它提供第二页,依此类推。这将一直持续到我重新启动apache,然后重新开始该过程。

[编辑]我已将mod_wsgi配置为一次只运行一个进程,这会导致计时器在每种情况下都重置为相同的值。有趣的是,我的页面上有另一个组件,在每个请求上显示一个随机图像,使用顺序('?'),并且每次都刷新不同的图像,这表明缓存发生在Django而不是Apache中。

[编辑]根据之前的编辑,我回过头来查看相关的views.py文件,发现倒计时开始变量是在视图函数之外的模块中全局设置的。在视图函数中移动该设置解决了问题。所以事实证明它毕竟不是一个缓存问题。感谢大家的帮助。

4 个答案:

答案 0 :(得分:6)

根据我在Apache中使用mod_wsgi的经验,它们极不可能导致缓存。有几件事要尝试:

  1. 您的计算机和Web服务器之间可能有一些proxy server,它们正确或不恰当地缓存页面。有时,ISP运行代理服务器以减少网络外的带宽。您能否为要缓存的页面提供HTTP标头(Firebug可以为您提供这些标头)。我特别感兴趣的标题包括Cache-Control,Expires,Last-Modified和ETag。
  2. 您可以从settings.py文件发布MIDDLEWARE_CLASSES吗?您可能有一个为您执行缓存的中间件。
  3. 您可以为以下项目“加载缓存”,“django.core.cache”和“cache_page”grep您的代码。 A * grep -R“搜索”**将起作用。
  4. settings.py(或其导入的任何内容,如“来自localsettings import *”)是否包含CACHE_BACKEND?
  5. 重启apache会发生什么? (例如sudo服务apache重启)。如果重新启动清除问题,那么它可能是apache正在进行缓存(这可能也会清除一个locmen Django缓存后端)

答案 1 :(得分:2)

我刚看到这个:

  

支持自动重新加载您可以使用部署工具   激活对自动重新加载的支持。每当事情发生变化时   .wsgi文件,mod_wsgi将为我们重新加载所有守护进程。

     

为此,只需将以下指令添加到“目录”部分:

WSGIScriptReloading On

答案 2 :(得分:1)

您是否专门设置了Django缓存?从文档看来,你似乎清楚地知道Django是否正在缓存,因为它需要事先工作以使其工作。具体来说,您需要定义缓存文件的保存位置。

http://docs.djangoproject.com/en/dev/topics/cache/

答案 3 :(得分:1)

您是否正在为Apache / mod_wsgi使用多进程配置?如果是,那将解释为什么不同的响应可以具有不同的计时器值,因为初始化计时器的可能性对于每个处理处理请求是不同的。这就是为什么它可以跳来跳去。

阅读:

http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading

确定运行Apache / mod_wsgi的模式或配置,并发布该配置。不知道,有太多未知数。