代码之家  ›  专栏  ›  技术社区  ›  Travis

如何禁用django/mod wsgi页面缓存

  •  9
  • Travis  · 技术社区  · 15 年前

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

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

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

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

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

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

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

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

    4 回复  |  直到 11 年前
        1
  •  6
  •   John Paulett    15 年前

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

    1. 你可能有一些 proxy server 在您的计算机和适当或不适当地缓存页面的Web服务器之间。有时,ISP运行代理服务器来减少网络外的带宽。请提供缓存页面的HTTP头(Firebug可以提供这些头)好吗?我特别感兴趣的头文件包括缓存控制、过期、上次修改和etag。
    2. 可以从settings.py文件发布中间件类吗?您可能有一个中间件为您执行缓存。
    3. 您是否可以为以下项目grep您的代码“加载缓存”、“django.core.cache”和“缓存页面”。a*grep-r“search”**将起作用。
    4. settings.py(或它从localsettings import*导入的任何内容)是否包括cache_后端?
    5. 重新启动Apache时会发生什么?(例如sudo services apache restart)。如果重新启动清除了这个问题,那么它可能是Apache正在进行缓存(这也可能清除Locmen Django缓存后端)
        2
  •  2
  •   Brad    11 年前

    我刚发现这个:

    支持自动重新加载以帮助部署工具 激活自动重新加载的支持。每当有什么变化 .wsgi文件mod wsgi将为我们重新加载所有守护进程。

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

    WSGIScriptReloading On
    
        3
  •  1
  •   PKKid    15 年前

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

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

        4
  •  1
  •   Graham Dumpleton    15 年前

    您是否正在为apache/mod wsgi使用多进程配置?如果是的话,这将解释为什么不同的响应可以为计时器设置不同的值,因为对于处理请求的每个进程,初始化计时器时可能会有所不同。所以为什么它能跳跃。

    读一读:

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

    找出运行apache/mod wsgi的模式或配置,并发布该配置。不知道,有太多的未知。