【问题标题】:Django populate() isn't reentrantDjango populate() 不可重入
【发布时间】:2015-09-06 09:30:38
【问题描述】:

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

【问题讨论】:

  • 你是如何运行 Django 的?您是否在任何地方看到任何其他错误?
  • 我如何运行 django 是什么意思?我只在 apache 日志文件中得到错误。
  • 您使用什么来运行实际的 wsgi 应用程序? mod_wsgi?此错误是由 populate() 期间的错误引起的,在这种情况下,这是您下次运行时遇到的错误,或者不太可能是由于异步代码运行不正确 - 例如在没有正确配置的情况下使用 gevent 时。
  • 是的,我正在使用 mod_wsgi
  • 当我从 INSTALLED_APPS 中删除所有非 django 应用程序时,我遇到了其他问题,但“populate() is not reentrant”不再存在

标签: python django apache


【解决方案1】:

升级到 Django 1.7 后,我首先出现了这个 RuntimeError(在 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 上的 this thread

【讨论】:

  • 这只是一直给我一个错误,上面写着Target WSGI script '/home/admusr/project/WebManager/wsgi.py' does not contain WSGI application 'application'.
  • 使用这个解决方案 - 我得到“NameError: global name 'sys' is not defined”,因为这个 sn-p 缺少一个“import sys”
  • 以上代码不是完整的wsgi.py文件。您应该已经在默认文件顶部的某处有一个import sys。如果没有,请添加它。
  • 谢谢。这对我找到实际问题很有用。 -:)
  • 这很有帮助。谢谢。
【解决方案2】:

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

WSGIDaemonProcess ...
WSGIProcessGroup ...

刚刚了解到您可以在不定义它们的情况下运行单个 django 应用程序,但是当两个应用程序产生冲突时。

【讨论】:

  • 今天我也遇到了这种情况,当时我不小心将我为 Python 2.x 开发的 Django 项目部署到了​​ Webfaction 上的 Python 3.x 实例。我没有调查细节。只是在进入兔子洞之前需要检查一下。
【解决方案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。您的 settings.py 中可能缺少其他必需的包或错误

【讨论】:

    【解决方案4】:

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

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

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

    完全停止 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/

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2017-01-29
          • 2016-09-06
          • 2018-08-23
          • 1970-01-01
          • 2017-03-10
          • 1970-01-01
          • 1970-01-01
          • 2015-10-15
          • 2020-08-10
          相关资源
          最近更新 更多