gpt4 book ai didi

Django + WSGI : Refreshing Issues?

转载 作者:行者123 更新时间:2023-12-04 09:03:44 25 4
gpt4 key购买 nike

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

我的设置或多或少类似于 Django 教程中描述的内容:http://docs.djangoproject.com/en/dev/howto/deployment/modwsgi/#howto-deployment-modwsgi

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

我真的不太了解 WSGI 或“MiddleWare”或任何请求处理的东西。我来自 PHP 背景,一切正常 :)

无论如何,解决这个问题的好方法是什么?运行 WSGI 处理程序是否会以“守护程序模式”缓解问题?如果是这样,我如何让它在守护程序模式下运行?

最佳答案

以守护程序模式运行该进程将无济于事。这是正在发生的事情:

mod_wsgi 正在生成多个相同的进程来处理您的 Django 站点的传入请求。这些进程中的每一个都是它自己的 Python 解释器,并且可以处理传入的 Web 请求。这些进程是持久的(它们不会针对每个请求启动和拆除),因此单个进程可能会一个接一个地处理数千个请求。 mod_wsgi 能够同时处理多个 Web 请求,因为有多个进程。

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

简单的解决方案:每当您修改代码时,重新启动 Apache 进程。大多数时候,这就像从 shell “/etc/init.d/apache2 restart” 以 root 身份运行一样简单。我相信简单的重新加载也可以,速度更快,“/etc/init.d/apache2 reload”

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

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

关于Django + WSGI : Refreshing Issues?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1635995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com