Django 1.7 在 mod-wsgi 上的代码更改监控出现故障

Posted

技术标签:

【中文标题】Django 1.7 在 mod-wsgi 上的代码更改监控出现故障【英文标题】:Code change monitoring malfunctioning with Django 1.7 on mod-wsgi 【发布时间】:2015-01-29 17:09:01 【问题描述】:

这是我在所有在 mod_wsgi 中运行 Django 1.7 的网站上遇到的问题。问题的关键在于,如果在本地开发时,我在代码库中引入了一个致命错误,然后随后对其进行了更正,代码监控脚本不会检测到更正。

我在本地开发时使用Graham Dumpleton's monitor.py script 来检测代码库的更改(我使用 apache 而不是 Django 开发服务器)。

它总是在 Django

File "/home/me/.virtualenvs/myvirtualenv/lib/python2.7/site-packages/django/core/wsgi.py", line 14, in get_wsgi_application
    django.setup()
File "/home/me/virtualenvs/myvirtualenv/lib/python2.7/site-packages/django/__init__.py", line 21, in setup
    apps.populate(settings.INSTALLED_APPS)
File "/home/me/.virtualenvs/myvirtualenv/lib/python2.7/site-packages/django/apps/registry.py", line 78, in populate
    raise RuntimeError("populate() isn't reentrant")
RuntimeError: populate() isn't reentrant

令人恼火的是,如果我纠正了错误,monitor.py 不会检测到更改,所以我必须重新启动 apache,或者触摸另一个已经加载的文件(例如设置文件)。

我认为这是因为“重新加载代码只监视导入的文件(又名 sys.modules)”(source)。所以因为错误的文件没有成功导入,monitor.py不知道重启进程。

【问题讨论】:

这类似于python交互式解释器无法完美地重新加载。无论如何,内存中都有代码的副本,并且在许多情况下删除.pyc/.pyo 文件不起作用。我们通过在所有文件上放置一个观察程序并在更改时重新加载 apache 入口点 (wsgi) 来修复此错误。这有一点延迟,您可以将其关闭以进行生产。 我使用 uwsgi 发生了类似的事情。然后我开始使用need-app=true。这使得 uwsgi 丢弃应用程序,因为它没有正确加载。因此,一旦您开发了新的更改,它将起作用。也许你能找到类似的东西。 我最终切换到 Django 开发服务器进行本地开发。除非你有充分的理由,否则我会说这比使用 Apache 和 mod_wsgi 进行本地 Django 开发要好得多。 这里有问题吗?我可以看到投诉 :-) 但不是一个有正确答案的问题。另一方面,如果您确实有答案,请将其作为答案提供并接受。 【参考方案1】:

我不确定您的部署过程和生产操作系统是什么,但在 Linux/Ubuntu 世界中有一个名为 pyclean 的操作系统命令。在我的 Django/Python 部署脚本期间(通常通过结构),我发出命令“pyclean”。在项目根目录中。此脚本递归删除从当前文件夹开始的所有 .pyc 文件。我希望这会有所帮助。

【讨论】:

以上是关于Django 1.7 在 mod-wsgi 上的代码更改监控出现故障的主要内容,如果未能解决你的问题,请参考以下文章

Django 项目不适用于 Apache 和 mod-wsgi

具有默认值的外键上的 Django 1.7 迁移错误

在 django 1.7 上的数据迁移中,直到原子块结束才能执行查询

Heroku 上的 Django 1.7:如何让 makemigrations 重新扫描数据库?

AWS Elastic Beanstalk 上的 Django 1.7 - 应用程序未运行,仅看到“索引 /”

Django 1.7 抛出 django.core.exceptions.AppRegistryNotReady:模型尚未加载