Django populate() 不可重入

问题描述 投票:0回答:7

当我尝试在生产环境中加载 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
python django apache
7个回答
36
投票

这个 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 上的此线程了解更多详细信息。


6
投票

最后,我遇到的问题是我尝试运行第二个 Django 应用程序,但我的 apache 配置中没有定义以下内容:

WSGIDaemonProcess ...
WSGIProcessGroup ...

刚刚了解到您可以运行单个 django 应用程序而不需要定义它们,但是当它是两个应用程序时会产生冲突。


4
投票

有很多原因会导致

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

中可能缺少另一个必需的包或错误

3
投票

对于使用 AWS Lambda(也可以选择使用 zappa)的用户,当解压后压缩到部署包中的代码和依赖项的大小超过 250MB 时,可能会发生这种情况。

通常,zip 可能只有 50 MB,但解压后可能会超过 250 MB,因此您可能需要手动解压缩部署包以检查解压后是否太大。

https://docs.aws.amazon.com/lambda/latest/dg/limits.html


1
投票

完全披露 - “populate() 不可重入”错误可能有多种原因,检查最近的配置或程序更改是一个非常好的主意。

但是,当 Apache 更新且模块不再有效/已损坏/需要刷新时,也可能会发生此错误。 Apache 更新后,我们在 Webfaction 上发生了这种情况(但可能发生在任何主机上)。

使用 Apache 重启脚本无济于事,因为模块在重启时仍保持加载状态。根据您的系统,以及即使 Apache 关闭时 mod 是否也会被缓存,这可能会有所帮助。

完全停止 Apache。在 Webfaction 上,即:

~/webapps/<YOUR WEB APP>/apache2/bin/stop

等几秒钟,然后...

~/webapps/<YOUR WEB APP>/apache2/bin/start

这应该可以解决问题。如果您的系统缓存了模组,您可能需要在开始之前刷新缓存。

希望这有帮助!

这是他们给我的链接(我知道错误是不同的,但我们也因为同样的原因与填充错误发生了这种情况):

https://statusblog.webfaction.com/2018/05/16/regarding-glibc_private-errors-in-your-python-application/


1
投票

对我来说,这个错误是造成的,因为我没有正确地将我的

INSTALLED_APPS
拆分为本地和生产。这意味着在本地我使用了
django-cors-headers
而在生产中我没有使用。但我不小心离开了
django-cors-headers
,尽管我把它从我的作品中删除了
requirements.txt
。从生产中安装的应用程序中删除
cors-headers
后,错误消失了。


0
投票

我明白了,很多评论都是关于隐藏的问题,意味着

populate() 不可重入

不是原来的问题。 就我而言,我已更改主用户本地数据库中的密码,但忘记更改另一个项目中的数据库设置。

© www.soinside.com 2019 - 2024. All rights reserved.