如何禁用Django / mod_WSGI页面缓存

11 投票
4 回答
10035 浏览
提问于 2025-04-15 15:26

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

我有一个倒计时器,它通过获取当前的服务器时间来计算剩余的倒计时时间,然后把这个数字输出到HTML模板中。接着,一个JavaScript倒计时器会接管并为用户运行倒计时。

问题出现在用户刷新页面或者切换到其他有倒计时器的页面时。倒计时器的时间会不规律地跳动,通常在每次刷新时都会回到同一个时间。

我使用HTTPFox检查,发现页面并不是从我的浏览器缓存中加载的,所以看起来是Django或Apache在缓存页面。有没有办法禁用这个功能?我没有足够的流量去担心缓存脚本输出。或者我对这个问题的原因完全理解错了?

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

[编辑] 我对发生的事情有了更详细的描述:在对服务器的前7次请求中,页面是由脚本渲染并返回的,虽然这7个页面似乎都被缓存了,之后会显示出来。在第8次请求时,服务器返回第一页面。在第9次请求时,返回第二页面,依此类推,形成一个循环。这种情况会持续到我重启Apache,之后这个过程又会重新开始。

[编辑] 我已经配置mod_wsgi只运行一个进程,这导致每次倒计时都重置为相同的值。有趣的是,我页面上还有一个组件在每次请求时显示随机图片,使用order('?'),每次都会刷新出不同的图片,这说明缓存发生在Django中,而不是Apache。

[编辑] 根据之前的编辑,我回去检查了相关的views.py文件,发现倒计时开始的变量是在模块中全局设置的,而不是在视图函数内。把这个设置移动到视图函数内部解决了问题。所以这并不是缓存问题。感谢大家的帮助。

4 个回答

2

你在使用Apache/mod_wsgi的多进程配置吗?如果是的话,这就能解释为什么不同的响应可能会有不同的计时器值,因为每个处理请求的进程在初始化计时器的时间可能不同。所以这就是为什么计时器的值会有波动。

可以看看这个链接:

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

弄清楚你运行Apache/mod_wsgi的模式或配置是什么,可能还需要把你的配置发出来。因为不清楚具体情况,有太多不确定的因素。

2

你有没有特别设置Django的缓存功能?从文档来看,如果你在用Django的缓存,你应该很清楚,因为在使用之前需要做一些准备工作。具体来说,你需要定义缓存文件保存在哪里。

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

8

根据我在Apache中使用mod_wsgi的经验,它们造成缓存的可能性非常小。你可以尝试以下几件事:

  1. 有可能在你的电脑和网络服务器之间有一个代理服务器,它在缓存页面,可能是对的,也可能是不对的。有时候,互联网服务提供商会运行代理服务器来减少他们网络外的带宽使用。你能否提供一个被缓存页面的HTTP头信息(可以用Firebug获取这些信息)。我特别想知道的头信息包括Cache-Control、Expires、Last-Modified和ETag。
  2. 能否把你settings.py文件中的MIDDLEWARE_CLASSES发出来?可能你有一个中间件在为你执行缓存。
  3. 能否在你的代码中搜索以下内容:“load cache”、“django.core.cache”和“cache_page”。可以使用命令 *grep -R "search" ** 来完成。
  4. settings.py(或者它导入的任何东西,比如“from localsettings import *”)中是否包含CACHE_BACKEND?
  5. 重启apache后会发生什么?(例如,使用命令sudo services apache restart)。如果重启后问题解决了,那可能是apache在进行缓存(这也可能清除掉locmen Django缓存后端)。

撰写回答