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

django+wsgi:刷新问题?

  •  7
  • mpen  · 技术社区  · 15 年前

    我正在开发一个django网站。我正在live服务器上进行所有更改,只是因为这样做更容易。问题是,它似乎时不时地要缓存我正在处理的一个*.py文件。有时,如果我经常点击刷新,它会在页面的旧版本和新版本之间来回切换。

    我的设置或多或少像django教程中描述的那样: http://docs.djangoproject.com/en/dev/howto/deployment/modwsgi/#howto-deployment-modwsgi

    我是 猜测 这样做是因为它触发了wsgi处理程序的多个实例,并且根据http请求发送到哪个处理程序,我可能会收到页面的不同版本。重新启动apache似乎可以解决问题,但这很烦人。

    我真的不太了解wsgi或“中间件”或任何处理请求的东西。我来自一个php背景,在那里一切都正常:)

    不管怎样,解决这个问题的好办法是什么?运行wsgi处理程序会缓解这个问题吗?如果是,如何使它在后台程序模式下运行?

    4 回复  |  直到 15 年前
        1
  •  2
  •   Daniel Roseman    15 年前

    可以通过不在Live服务器上编辑代码来解决此问题。说真的,没有理由。使用版本控制在本地进行开发,如果必须,则从实时签出运行服务器,并使用签出最新版本并重新启动apache的post commit钩子。

        2
  •  17
  •   BrainCore    15 年前

    在后台程序模式下运行进程将没有帮助。下面是发生的事情:

    mod_wsgi正在生成多个相同的进程来处理django站点的传入请求。这些进程中的每一个都是自己的Python解释器,可以处理传入的Web请求。这些进程是持久的(它们不会针对每个请求被调出或分解),因此一个进程可以一个接一个地处理数千个请求。mod_wsgi能够同时处理多个web请求,因为有多个进程。

    每当执行“导入模块”时,每个进程的python解释器都会加载模块(自定义python文件)。在django的上下文中,当由于web请求需要一个新的view.py时,就会发生这种情况。加载模块后,它将驻留在内存中,因此对文件所做的任何更改都不会反映在该进程中。随着更多的web请求进入,进程的python解释器将只使用已经加载到内存中的模块版本。您看到刷新之间的不一致性,因为您所做的每个Web请求都可以由不同的进程来处理。有些进程可能在代码的早期版本中加载了python模块,而其他进程可能在稍后加载(因为这些进程没有收到web请求)。

    简单的解决方案:只要修改代码,就重新启动apache进程。大多数情况下,只要从shell“/etc/init.d/apache2 restart”以根用户身份运行就可以了。我相信一个简单的重新加载也能工作,它更快,“/etc/init.d/apache2 reload”

    守护进程解决方案:如果您在守护进程模式下使用mod_wsgi,那么您只需触摸(unix命令)或修改您的wsgi脚本文件。为了澄清scrompt.com的帖子,修改python源代码不会导致mod_wsgi重新加载代码。只有在修改了wsgi脚本文件时才会重新加载。

    最后一点要注意的是:我只谈到wsgi是为了简单起见而使用进程的。wsgi实际上在每个进程中使用线程池。我不觉得这个细节与这个答案相关,但你可以通过阅读了解更多。 mod_wsgi .

        3
  •  5
  •   Edward Dale    15 年前

    因为您在嵌入式模式下使用mod_wsgi,所以不会自动看到您的更改。您偶尔会看到它们,因为apache有时会启动新的处理程序实例,这些实例会捕获更新。

    可以通过使用守护进程模式来解决此问题,如所描述的 here . 具体来说,您需要将以下指令添加到您的apache配置中:

    WSGIDaemonProcess example.com processes=2 threads=15 display-name=%{GROUP}
    WSGIProcessGroup example.com
    
        4
  •  5
  •   Graham Dumpleton    15 年前

    阅读mod_wsgi文档,而不是依赖django站点上包含的mod_wsgi宿主的最小信息。部分内容如下:

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

    这将告诉您如何在MODYWSGI中重新加载源代码,包括一个监视器,可以用来实现Django RunServer的相同类型的源代码重载。还可以看看哪些讨论如何将其应用于django。

    http://blog.dscpl.com.au/2008/12/using-modwsgi-when-developing-django.html http://blog.dscpl.com.au/2009/02/source-code-reloading-with-modwsgi-on.html