Django停止使用RuntimeError:populate()不可重入

Edw*_*ard 88 apache django mod-wsgi django-wsgi

我一直在使用WSGI开发部署在Apache服务器上的Django Web应用程序,一切都进展顺利.今天,我对我的应用程序进行了一些小的更改,admin.py试图自定义内置的Django Admin界面,并且最初产生了语法错误(一个未闭合的括号).这意味着当我触摸wsgi.py并加载代码时(我在我的虚拟主机上以守护进程模式运行WSGI),我的网站被替换为内部服务器错误,因为WSGI在遇到语法错误时停止了.

所以我修复了语法错误,检查了我没有更多manage.py check,并触及wsgi.py重新部署.但我的网站仍然显示内部服务器错误!检查Apache日志,这是我看到的:

[Sun Nov 23 13:52:46 2014] [info] mod_wsgi (pid=19093): Create interpreter 'quotes.cs.cornell.edu|'.
[Sun Nov 23 13:52:46 2014] [info] mod_wsgi (pid=19093): Adding '/extra/www/html/quotes/quotes_django' to path.
[Sun Nov 23 13:52:46 2014] [info] mod_wsgi (pid=19093): Adding '/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/' to path.
[Sun Nov 23 13:52:46 2014] [info] [client 128.84.33.19] mod_wsgi (pid=19093, process='quotes.cs.cornell.edu',
  application='quotes.cs.cornell.edu|'): Loading WSGI script '/extra/www/html/quotes/quotes_django/quotes_django/
wsgi.py'.
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] mod_wsgi (pid=19093): Target WSGI script '/extra/www/html/
quotes/quotes_django/quotes_django/wsgi.py' cannot be loaded as Python module.
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] mod_wsgi (pid=19093): Exception occurred processing WSGI
script '/extra/www/html/quotes/quotes_django/quotes_django/wsgi.py'.
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] Traceback (most recent call last):
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]   File "/extra/www/html/quotes/quotes_django/
quotes_django/wsgi.py", line 14, in <module>
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]     application = get_wsgi_application()
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/core/wsgi.py", line 14, in get_wsgi_application
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]     django.setup()
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/__init__.py", line 21, in setup
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]     apps.populate(settings.INSTALLED_APPS)
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/apps/registry.py", line 115, in populate
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]     app_config.ready()
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/contrib/admin/apps.py", line 22, in ready
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]     self.module.autodiscover()
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/contrib/admin/__init__.py", line 23, in autodiscover
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]     autodiscover_modules('admin', register_to=site)
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/utils/module_loading.py", line 74, in autodiscover_modules
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]     import_module('%s.%s' % (app_config.name,         
module_to_search))
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]   File "/usr/lib64/python2.7/importlib/__init__.py", line 
37, in import_module
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]     __import__(name)
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]   File "/extra/www/html/quotes/quotes_django/quotespage/
admin.py", line 25
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]     approve_quotes.short_description = "Approve selected
quotes"
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]                  ^
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] SyntaxError: invalid syntax
[Sun Nov 23 13:53:36 2014] [info] [client 128.84.33.19] mod_wsgi (pid=19093, process='quotes.cs.cornell.edu',
  application='quotes.cs.cornell.edu|'): Loading WSGI script '/extra/www/html/quotes/quotes_django/quotes_django/
wsgi.py'.
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19] mod_wsgi (pid=19093): Target WSGI script '/extra/www/html/
quotes/quotes_django/quotes_django/wsgi.py' cannot be loaded as Python module.
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19] mod_wsgi (pid=19093): Exception occurred processing WSGI
script '/extra/www/html/quotes/quotes_django/quotes_django/wsgi.py'.
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19] Traceback (most recent call last):
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19]   File "/extra/www/html/quotes/quotes_django/         
quotes_django/wsgi.py", line 14, in <module>
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19]     application = get_wsgi_application()
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/core/wsgi.py", line 14, in get_wsgi_application
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19]     django.setup()
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/__init__.py", line 21, in setup
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19]     apps.populate(settings.INSTALLED_APPS)
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/apps/registry.py", line 78, in populate
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19]     raise RuntimeError("populate() isn't reentrant")
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19] RuntimeError: populate() isn't reentrant
Run Code Online (Sandbox Code Playgroud)

由于我的语法错误,第一系列错误显示WSGI失败admin.py.但是,第二系列错误似乎表明Django内部存在错误:

RuntimeError: populate() isn't reentrant
Run Code Online (Sandbox Code Playgroud)

抛出的populate方法registry.py.

谷歌搜索此错误消息令人惊讶的回报很少,没有来自Django文档.显然,如果您在应用程序中为应用程序命名两次,有时会发生这种情况settings.py,但我不是这样做的.更重要的是,settings.py自从网站工作正常以来我没有改变- 我唯一改变的是admin.py.

我尝试恢复我所做的所有更改,所以我的所有Python代码都恢复到网站工作时的状态 - populate() isn't reentrant当我尝试让WSGI重新加载代码时,我仍然会收到错误!

我还尝试在INSTALLED_APPS部分中注释掉不同的应用程序settings.py,即使只启用了"django.contrib.staticfiles",错误仍然会发生.奇怪的是,即使我注释掉所有应用程序,我仍然会收到错误- 即使没有加载任何应用程序,Django也会抛出错误!

有谁知道这里发生了什么?或者我调试此错误的更好方法,因为Apache日志中的回溯非常无益?

注意:我正在使用Django 1.7,Apache 2.2和Python 2.7.

Edw*_*ard 59

我的服务器管理员重新启动了Apache,这神奇地解决了这个问题.加载完全相同的Python文件而不会导致populate() isn't reentrant.我甚至尝试加载另一个带有语法错误的文件,然后修复它,服务器能够加载新文件并正确运行而没有任何问题.

我仍然不知道出了什么问题,但是由于问题已经消失,我将此标记为已回答.(好吧,一旦StackOverflow允许我接受我自己的答案,我会将其标记为已回答.)

更新:在我意外上传带有语法错误的Python后继续出现此错误后,我想出了一个比重启Apache更容易的解决方法.当WSGI开始抛出populate() isn't reentrant错误时,我wsgi.py用这个简单的函数替换我的Django项目:

def application(environ, start_response):
    if environ['mod_wsgi.process_group'] != '': 
        import signal
        os.kill(os.getpid(), signal.SIGINT)
    return ["killed"]
Run Code Online (Sandbox Code Playgroud)

然后我重新加载我的网站,并重新启动WSGI守护进程(我可以通过查看Apache日志来判断,即使网站仍然显示相同的500错误).

如果我然后再wsgi.py恢复正常并重新加载,WSGI成功地获取我的代码而不抛出populate() isn't reentrant(假设这次我没有语法错误).所以整个Apache不需要重启,只需要重启WSGI进程,而且我可以在没有root权限的情况下完成.

  • 对我来说,问题不在于我在我的某个应用中迁移了对模型所做的更改. (7认同)
  • 在较新版本的mod_wsgi中,mod_wsgi的守护进程模式有一个``startup-timeout``选项,它有助于在初始化Django时从瞬态错误中恢复,例如数据库不可用.如果在超时期限后WSGI应用程序未正确加载,则超时将导致进程自动重新启动.即使这对您自己的代码存在永久性问题也无济于事.在这种情况下,查找第一个错误,而不是``populate()``错误,因为它会给出代码失败的真正原因. (4认同)

Jes*_*mez 36

我知道这是一个陈旧的答案,但我会为我的解决方案做出贡献:

作为一种诊断问题来源的方法manage.py check,看看你是否发现了什么

在我的情况下,过时的要求是问题,并且django未能导入子模块

确保您的要求是最新的

  • 我在Apache上得到错误500,我找不到问题.通过这个命令`manage.py check`我发现了问题.谢谢. (2认同)

Cer*_*rin 29

这是由您的Django设置中的某个错误引起的。不幸的是,Django将该错误隐藏在此通用且无用的错误消息背后。

为了揭示真正的问题,打开django/apps/registry.py并围绕80行,替换:

raise RuntimeError("populate() isn't reentrant")
Run Code Online (Sandbox Code Playgroud)

与:

self.app_configs = {}
Run Code Online (Sandbox Code Playgroud)

这将允许Django继续加载,并显示实际错误。

我因几种不同的原因遇到了此错误。曾经是因为我的一个应用程序admin.py中导入错误。

  • 到目前为止,这是该线程中最有用的答案。现在我知道-&gt;`django.core.exceptions.ImproperlyConfigured:需要psycopg2_version 2.5.4或更高版本;您有2.5(dt dec pq3 ext)` (8认同)
  • 这个答案是纯金的。 (6认同)
  • @RickyA,这是迄今为止最有用的评论,因为我什至不必费心这个答案,只需尝试“pip install --upgrade psycopg2”即可修复它。 (5认同)
  • 救了我。该解决方案使我能够成功检查缺少的需求以及它们之间的兼容性错误。 (3认同)
  • 如果有人将 django 与 `docker`(或 `docker-compose`)一起使用,则在创建映像时可以通过添加以下行轻松替换 `Dockerfile` 中的行:`RUN sed -i "s/raise RuntimeError(\" populate() 不可重入\")/self.app_configs = {}/g" /usr/local/lib/python3.7/site-packages/django/apps/registry.py`(Python 版本可能必须进行调整)。 (3认同)
  • 这太完美了。更改这一行让我看到我遇到了一个简单的导入错误。我无法判断之前发生了什么。 (2认同)
  • 这绝对应该是正确的答案,而且应该在 Django 中更新:) 谢谢! (2认同)
  • 如何导航到“django/apps/registry.py”目录。我已经使用 pip 安装了 django。 (2认同)

小智 17

这不是回应,而是反思。

当您升级到 django 1.7 并且出现 500 错误并重新加载页面时,Apache 会提示“populate() 不可重入”。我认为是当您加载页面时,Apache 会加载您的应用程序所需的所有模块,并且当错误得到处理时,它不会卸载模块。因此,当您重新加载页面时,apache 会再次加载这些模块,但它已经加载了。所以,apache 说“populate() 不是可重入的”。

我有两个措施来纠正这个问题:重新启动 apache,或者纠正处理第一个 5OO 错误的错误。

尝试使用以下命令重新启动 apache:

sudo service httpd restart
Run Code Online (Sandbox Code Playgroud)

我希望它会帮助你。


don*_*ner 9

如果您在使用Google App Engine时遇到此错误,请检查日志中是否存在可能导致此问题的其他错误.我得到了:

ImproperlyConfigured: Error loading either pysqlite2 or sqlite3 modules (tried in that order): No module named _sqlite3

您不能将SQLite与Google App Engine一起使用,因此请注释掉DATABASESsettings.py停止该错误和RuntimeError("populate() isn't reentrant")错误的部分.