11

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

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

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

使用 HTTPFox,该页面没有从我的浏览器缓存中加载,因此看起来 Django 或 Apache 正在缓存该页面。有没有办法禁用这个功能?我不会有足够的流量来担心缓存脚本输出。或者我对为什么会发生这种情况完全错误?

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

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

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

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

4

4 回答 4

8

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

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

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

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

于 2009-10-27T21:25:13.267 回答
2

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

阅读:

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

找出您正在运行 Apache/mod_wsgi 的模式或配置,并可能发布该配置是什么。在不知不觉中,有太多的未知数。

于 2009-10-28T09:45:08.253 回答
2

我刚遇到这个:

支持自动重新加载 为了帮助部署工具,您可以激活对自动重新加载的支持。每当 .wsgi 文件发生更改时,mod_wsgi 将为我们重新加载所有守护进程。

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

WSGIScriptReloading On
于 2013-05-25T20:16:30.577 回答