apache Django populate()不能重入

brqmpdu1  于 2023-10-23  发布在  Apache
关注(0)|答案(7)|浏览(173)

当我尝试在生产环境中加载Django应用程序时,我总是遇到这个问题。我尝试了所有的stackoverflow答案,但没有解决它。还有其他想法吗。(我使用Django 1.5.2和Apache)

  1. Traceback (most recent call last):
  2. File "/var/www/thehomeboard/wwwhome/wsgi.py", line 37, in <module>
  3. application = get_wsgi_application()
  4. File "/usr/local/lib/python2.7/dist-packages/django/core/wsgi.py", line 14, in get_wsgi_application
  5. django.setup()
  6. File "/usr/local/lib/python2.7/dist-packages/django/__init__.py", line 18, in setup
  7. apps.populate(settings.INSTALLED_APPS)
  8. File "/usr/local/lib/python2.7/dist-packages/django/apps/registry.py", line 78, in populate
  9. raise RuntimeError("populate() isn't reentrant")
  10. RuntimeError: populate() isn't reentrant
sh7euo9m

sh7euo9m1#

这个RuntimeError是在我升级到Django 1.7之后第一次出现的(现在Django 1.8仍然存在)。它通常是由Django应用程序引起的,它引发了一个错误,但该错误以某种方式被吞下。
这里有一个适合我的变通方法。将其添加到您的wsgi.py,并记录 * 真实的 * 错误:

  1. import os
  2. import time
  3. import traceback
  4. import signal
  5. import sys
  6. from django.core.wsgi import get_wsgi_application
  7. try:
  8. application = get_wsgi_application()
  9. print 'WSGI without exception'
  10. except Exception:
  11. print 'handling WSGI exception'
  12. # Error loading applications
  13. if 'mod_wsgi' in sys.modules:
  14. traceback.print_exc()
  15. os.kill(os.getpid(), signal.SIGINT)
  16. time.sleep(2.5)

查看modwsgi上的这篇文章了解更多细节。

展开查看全部
pgx2nnw8

pgx2nnw82#

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

  1. WSGIDaemonProcess ...
  2. WSGIProcessGroup ...

刚刚了解到你可以运行一个Django应用程序而不定义它们,但是当它是两个时,它会产生冲突。

zqry0prt

zqry0prt3#

会有很多原因导致populate() isn't reentrant错误。如果你在django应用程序中查看registry.py,可能就在这个目录中。
/python2.7/site-packages/django/apps

  1. # app_config should be pristine, otherwise the code below won't
  2. # guarantee that the order matches the order in INSTALLED_APPS.
  3. if self.app_configs:
  4. raise RuntimeError("populate() isn't reentrant")

正如你在评论中看到的,它说app_config应该是原始的。这意味着如果其中一个配置不正确或缺少所需的库,则会出现此填充错误。我得到这个错误,因为我错过了sqlite安装。即使如您所见,异常中也没有提到可能的原因。我在debian上用这个命令安装了sqlite

  1. pip install pysqlite

它解决了我的问题。我的例外,因为失踪pysqlite.你可能有失踪的另一个所需的软件包或错误,在您的settings.py

goucqfw6

goucqfw64#

对于使用AWS Lambda(以及可选地使用zappa)的用户,当压缩到部署包中的代码和依赖项的大小在解压缩后超过250 MB时,可能会发生这种情况。
通常,zip可能只有50 MB,但可能会超过250 MB,因此您可能需要手动解压缩部署包,以检查它在解压缩时是否太大。
https://docs.aws.amazon.com/lambda/latest/dg/limits.html

vbkedwbf

vbkedwbf5#

充分披露-“populate()isn 't reentrant”错误可能有多种原因,检查任何最近的配置或程序更改是一个非常好的主意。
但是,当Apache更新时,并且模块不再有效/已损坏/需要刷新时,也可能发生此错误。这发生在Apache更新后的Webfaction上(但可能发生在任何主机上)。
使用Apache重新启动脚本对此没有帮助,因为模块在重新启动时仍处于加载状态。这可能会有所帮助,具体取决于您的系统,以及即使在Apache关闭时是否缓存了MOD。
完全停止Apache。在WebFaction上,这是:

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

再等几秒钟,然后...

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

这应该可以纠正这个问题。如果你的系统缓存了mod,你可能需要在启动前刷新该高速缓存。
希望这对你有帮助!
这是他们给我的链接(我知道错误是不同的,但我们也有同样的原因与填充错误):
https://statusblog.webfaction.com/2018/05/16/regarding-glibc_private-errors-in-your-python-application/

pgvzfuti

pgvzfuti6#

对我来说,这个错误是因为我没有正确地将我的INSTALLED_APPS分为本地和生产。这意味着在本地我使用django-cors-headers,而在生产中我没有。但是我意外地留下了django-cors-headers,尽管我从生产requirements.txt中删除了它。从生产中安装的应用程序中删除cors-headers后,错误消失了。

tpgth1q7

tpgth1q77#

我明白了,很多评论都是关于隐藏的问题,
populate()不是可重入的
并不是一个原始的问题。在我的情况下,我已经改变了密码在我的本地数据库的主用户,我忘记改变数据库设置在另一个项目。

相关问题