Django populate()不是可重入的

时间:2015-06-20 13:11:37

标签: python django apache

当我尝试在生产中加载我的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

6 个答案:

答案 0 :(得分:29)

这个RuntimeError在升级到Django 1.7之后首次出现(并且仍然存在于Django 1.8中)。它通常是由一个引发错误的Django应用程序引起的,但是以某种方式吞下了这个错误。

这是一个对我有用的解决方法。将其添加到您的wsgi.py并记录真正的错误:

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上的this thread

答案 1 :(得分:6)

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

WSGIDaemonProcess ...
WSGIProcessGroup ...

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

答案 2 :(得分:3)

导致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.Your可能缺少您settings.py

中的其他必需包或错误

答案 3 :(得分:1)

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

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

使用Apache重启脚本对此没有帮助,因为模块在重启时仍然加载。根据您的系统,以及即使Apache关闭也是否缓存mod,这可能有所帮助。

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

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

等几秒钟,然后......

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

那应该纠正这个问题。如果您的系统缓存了mod,则可能必须在启动之前刷新缓存。

希望这有帮助!

以下是他们给我的链接(我知道错误不同,但我们也出现了与填充错误相同的原因):

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

答案 4 :(得分:0)

对于那些使用 AWS Lambda (以及可选地使用zappa)的人来说,这可能发生在代码大小和&amp;压缩后,压缩到部署包中的依赖项超过250MB。

通常,zip可能只有50 MB,但可能会解压缩到超过250 MB,因此您可能需要手动解压缩部署包,以确保它在未压缩时不会太大。

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

答案 5 :(得分:0)

对我来说,造成此错误是因为我没有正确地将INSTALLED_APPS分为本地和生产。在本地,我使用django-cors-headers,而在生产中,我没有使用。但是,即使我从产品django-cors-headers中删除了requirements.txt,我还是意外地离开了它。从生产中已安装的应用中删除cors-headers后,错误消失了。