当我尝试在生产环境中加载 Django 应用程序时,我不断收到此消息。我尝试了所有的 stackoverflow 答案,但没有任何解决办法。任何其他想法。 (我正在使用 Django 1.5.2 和 Apache)
Traceback (most recent call last):
File "/var/www/thehomeboard/wwwhome/wsgi.py", line 37, in <module>
application = get_wsgi_application()
File "/usr/local/lib/python2.7/dist-packages/django/core/wsgi.py", line 14, in get_wsgi_application
django.setup()
File "/usr/local/lib/python2.7/dist-packages/django/__init__.py", line 18, in setup
apps.populate(settings.INSTALLED_APPS)
File "/usr/local/lib/python2.7/dist-packages/django/apps/registry.py", line 78, in populate
raise RuntimeError("populate() isn't reentrant")
RuntimeError: populate() isn't reentrant
这个 RuntimeError 第一次出现在我升级到 Django 1.7 后(并且在 Django 1.8 中仍然存在)。它通常是由 Django 应用程序引发错误引起的,但该错误以某种方式被吞没了。
这是一个适合我的解决方法。将其添加到您的 wsgi.py 中,并且应该记录 real 错误:
import os
import time
import traceback
import signal
import sys
from django.core.wsgi import get_wsgi_application
try:
application = get_wsgi_application()
print 'WSGI without exception'
except Exception:
print 'handling WSGI exception'
# Error loading applications
if 'mod_wsgi' in sys.modules:
traceback.print_exc()
os.kill(os.getpid(), signal.SIGINT)
time.sleep(2.5)
请参阅 modwsgi 上的此线程了解更多详细信息。
最后,我遇到的问题是我尝试运行第二个 Django 应用程序,但我的 apache 配置中没有定义以下内容:
WSGIDaemonProcess ...
WSGIProcessGroup ...
刚刚了解到您可以运行单个 django 应用程序而不需要定义它们,但是当它是两个应用程序时会产生冲突。
有很多原因会导致
populate() isn't reentrant
错误。如果你在 django 应用程序中查看 registry.py
可能就在这个目录中/python2.7/site-packages/django/apps
# app_config should be pristine, otherwise the code below won't
# guarantee that the order matches the order in INSTALLED_APPS.
if self.app_configs:
raise RuntimeError("populate() isn't reentrant")
正如您在评论中看到的那样,app_config 应该是原始的。这意味着如果其中一项配置不正确或缺少所需的库,则会出现此填充错误。我收到此错误是因为我错过了 sqlite 安装。即使如您所见,异常中也没有提及可能的原因。我在 debian 上通过这个命令安装了 sqlite
pip install pysqlite
它解决了我的问题。我的例外是因为缺少 pysqlite。您的
settings.py
中可能缺少另一个必需的包或错误
对于使用 AWS Lambda(也可以选择使用 zappa)的用户,当解压后压缩到部署包中的代码和依赖项的大小超过 250MB 时,可能会发生这种情况。
通常,zip 可能只有 50 MB,但解压后可能会超过 250 MB,因此您可能需要手动解压缩部署包以检查解压后是否太大。
完全披露 - “populate() 不可重入”错误可能有多种原因,检查最近的配置或程序更改是一个非常好的主意。
但是,当 Apache 更新且模块不再有效/已损坏/需要刷新时,也可能会发生此错误。 Apache 更新后,我们在 Webfaction 上发生了这种情况(但可能发生在任何主机上)。
使用 Apache 重启脚本无济于事,因为模块在重启时仍保持加载状态。根据您的系统,以及即使 Apache 关闭时 mod 是否也会被缓存,这可能会有所帮助。
完全停止 Apache。在 Webfaction 上,即:
~/webapps/<YOUR WEB APP>/apache2/bin/stop
等几秒钟,然后...
~/webapps/<YOUR WEB APP>/apache2/bin/start
这应该可以解决问题。如果您的系统缓存了模组,您可能需要在开始之前刷新缓存。
希望这有帮助!
这是他们给我的链接(我知道错误是不同的,但我们也因为同样的原因与填充错误发生了这种情况):
对我来说,这个错误是造成的,因为我没有正确地将我的
INSTALLED_APPS
拆分为本地和生产。这意味着在本地我使用了 django-cors-headers
而在生产中我没有使用。但我不小心离开了django-cors-headers
,尽管我把它从我的作品中删除了requirements.txt
。从生产中安装的应用程序中删除 cors-headers
后,错误消失了。
我明白了,很多评论都是关于隐藏的问题,意味着
populate() 不可重入
不是原来的问题。 就我而言,我已更改主用户本地数据库中的密码,但忘记更改另一个项目中的数据库设置。