当前位置: 首页 > 知识库问答 >
问题:

Django停止使用RuntimeError:填充()不是可重入的

金高轩
2023-03-14

我一直在用WSGI开发部署在Apache服务器上的Django web应用程序,一切都进展顺利。今天,我对我的应用程序的管理做了一些小改动。py试图自定义内置Django管理界面,最初出现语法错误(未闭合的括号)。这意味着当我触摸wsgi时。py并加载了代码(我在虚拟主机上以守护进程模式运行WSGI),我的网站被替换为内部服务器错误,因为WSGI在遇到语法错误时停止。

因此,我修复了语法错误,检查了我没有任何更多的管理。py检查,并触摸wsgi。py重新部署。但我的网站仍然显示一个内部服务器错误!查看Apache日志,我看到的是:

[Sun Nov 23 13:52:46 2014] [info] mod_wsgi (pid=19093): Create interpreter 'quotes.cs.cornell.edu|'.
[Sun Nov 23 13:52:46 2014] [info] mod_wsgi (pid=19093): Adding '/extra/www/html/quotes/quotes_django' to path.
[Sun Nov 23 13:52:46 2014] [info] mod_wsgi (pid=19093): Adding '/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/' to path.
[Sun Nov 23 13:52:46 2014] [info] [client 128.84.33.19] mod_wsgi (pid=19093, process='quotes.cs.cornell.edu',
  application='quotes.cs.cornell.edu|'): Loading WSGI script '/extra/www/html/quotes/quotes_django/quotes_django/
wsgi.py'.
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] mod_wsgi (pid=19093): Target WSGI script '/extra/www/html/
quotes/quotes_django/quotes_django/wsgi.py' cannot be loaded as Python module.
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] mod_wsgi (pid=19093): Exception occurred processing WSGI
script '/extra/www/html/quotes/quotes_django/quotes_django/wsgi.py'.
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] Traceback (most recent call last):
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]   File "/extra/www/html/quotes/quotes_django/
quotes_django/wsgi.py", line 14, in <module>
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]     application = get_wsgi_application()
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/core/wsgi.py", line 14, in get_wsgi_application
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]     django.setup()
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/__init__.py", line 21, in setup
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]     apps.populate(settings.INSTALLED_APPS)
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/apps/registry.py", line 115, in populate
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]     app_config.ready()
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/contrib/admin/apps.py", line 22, in ready
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]     self.module.autodiscover()
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/contrib/admin/__init__.py", line 23, in autodiscover
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]     autodiscover_modules('admin', register_to=site)
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/utils/module_loading.py", line 74, in autodiscover_modules
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]     import_module('%s.%s' % (app_config.name,         
module_to_search))
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]   File "/usr/lib64/python2.7/importlib/__init__.py", line 
37, in import_module
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]     __import__(name)
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]   File "/extra/www/html/quotes/quotes_django/quotespage/
admin.py", line 25
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]     approve_quotes.short_description = "Approve selected
quotes"
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19]                  ^
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] SyntaxError: invalid syntax
[Sun Nov 23 13:53:36 2014] [info] [client 128.84.33.19] mod_wsgi (pid=19093, process='quotes.cs.cornell.edu',
  application='quotes.cs.cornell.edu|'): Loading WSGI script '/extra/www/html/quotes/quotes_django/quotes_django/
wsgi.py'.
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19] mod_wsgi (pid=19093): Target WSGI script '/extra/www/html/
quotes/quotes_django/quotes_django/wsgi.py' cannot be loaded as Python module.
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19] mod_wsgi (pid=19093): Exception occurred processing WSGI
script '/extra/www/html/quotes/quotes_django/quotes_django/wsgi.py'.
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19] Traceback (most recent call last):
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19]   File "/extra/www/html/quotes/quotes_django/         
quotes_django/wsgi.py", line 14, in <module>
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19]     application = get_wsgi_application()
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/core/wsgi.py", line 14, in get_wsgi_application
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19]     django.setup()
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/__init__.py", line 21, in setup
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19]     apps.populate(settings.INSTALLED_APPS)
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19]   File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/apps/registry.py", line 78, in populate
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19]     raise RuntimeError("populate() isn't reentrant")
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19] RuntimeError: populate() isn't reentrant

第一系列错误显示,由于我的管理中的语法错误,WSGI失败。py。然而,第二系列错误似乎显示了Django内部的错误:

RuntimeError: populate() isn't reentrant

从注册表的populate方法抛出。py。

谷歌搜索此错误消息返回的信息少得惊人,没有一个来自Django留档。显然,如果您在settings.py中为应用程序命名两次,有时会发生这种情况,但我不会这样做。更重要的是,自从网站运行良好以来,我没有更改过settings.py——我唯一更改的是admin.py

我尝试恢复我所做的所有更改,因此我的所有Python代码都恢复到网站工作时的状态——当我试图让WSGI重新加载代码时,我仍然会发现populate()不可重入!

我还试着在设置的INSTALLED_apps部分评论不同的应用。py,甚至只有“django”。contrib。启用staticfiles后,错误仍会发生。奇怪的是,即使我注释掉了所有的应用程序,我仍然会出错——Django即使没有加载任何应用程序也会抛出错误!

有人知道这里发生了什么吗?或者有什么更好的方法来调试这个错误,因为Apache日志中的回溯非常无用?

注意:我使用的是Django 1.7、Apache 2.2和Python 2.7。


共有3个答案

段干长恨
2023-03-14

我知道这是一个古老的答案,但我将贡献我的解决方案:

作为诊断问题根源的一种方法,请运行“管理”。检查一下,看看有没有发现什么

在我的案例中,一个过时的需求是问题所在,django未能导入子模块

确保您的要求是最新的

宗安翔
2023-03-14
匿名用户

我的服务器管理员重启了Apache,神奇地解决了这个问题。加载的完全相同的Python文件不会导致populate(),因此不可重入。我甚至尝试加载另一个语法错误的文件,然后修复它,服务器能够加载新文件并正常运行,没有任何问题。

我仍然不知道出了什么问题,但我将此标记为已回答,因为问题已经解决。(好吧,只要StackOverflow允许我接受自己的答案,我就会将其标记为已回答。)

更新:当我不小心上传带有语法错误的Python时,继续收到这个错误,我想出了一个比重新启动Apache更容易的解决方法。当WSGI开始抛出填充()不是可重入的错误时,我用这个简单的函数替换了我的Django项目的wsgi.py

def application(environ, start_response):
    if environ['mod_wsgi.process_group'] != '': 
        import signal
        os.kill(os.getpid(), signal.SIGINT)
    return ["killed"]

然后我重新加载我的网站,WSGI守护进程重新启动(我可以通过查看Apache日志来判断,即使网站仍然显示相同的500错误)。

如果我随后更改wsgi。py恢复正常并再次重新加载,WSGI成功地提取了我的代码,而没有抛出populate()不可重入(假设我这次没有语法错误)。所以整个Apache不需要重新启动,只需要WSGI进程,我可以在没有root权限的情况下完成。

羊舌新荣
2023-03-14

这是由Django设置中的某个错误引起的。不幸的是,Django在这个通用且无用的错误消息背后隐藏了错误。

要揭示真正的问题,请打开django/apps/registry.py并在第80行左右替换:

raise RuntimeError("populate() isn't reentrant")

使用:

self.app_configs = {}

这将允许Django继续加载,并显示实际错误。

我遇到这个错误有几个不同的原因。有一次是因为我在我的应用程序的一个admin.py.中有一个错误的导入

 类似资料:
  • 当我试着在生产环境中加载Django应用程序时,我总是会遇到这种情况。我尝试了所有的stackoverflow答案,但都没有解决。还有其他想法吗。(我正在使用Django 1.5.2和Apache)

  • 我正在尝试部署django网站。项目名称是pom。我试图使用apache2在ec2服务器中运行django网站并收到以下错误: Apache错误文件: 我的pom。设置。py如下: wsgi。py文件如下:

  • 问题内容: 我一直在开发使用WSGI部署在Apache服务器上的Django Web应用程序,并且一切进展顺利。今天,我对应用程序进行了一些较小的更改,以尝试自定义内置的Django Admin接口,并且最初出现了语法错误(括号未封闭)。这意味着当我触摸并加载代码时(我的虚拟主机上的WSGI以守护程序模式运行),我的网站被内部服务器错误替换,因为WSGI遇到语法错误时就停止了。 因此,我更正了语法

  • 我有一个,供用户更改电子邮件 如何停止Chrome自动填充输入。 Chrome记住登录页面的输入数据,并自动填写帐户设置页面。 Chrome自动填充更改我的电子邮件

  • 问题内容: 当我尝试在生产环境中加载Django应用程序时,我会不断收到此消息。我尝试了所有stackoverflow答案,但没有任何解决方法。还有其他想法。(我正在使用Django 1.5.2和Apache) 问题答案: 我遇到的问题是我尝试运行第二个Django应用程序,而我的apache配置中没有定义以下内容: 你可以运行一个django应用程序而无需定义它们,但是当两个应用程序产生冲突时。

  • 问题内容: 我正在分析一个时间序列,并基于某些条件,我可以挑选出事件 开始 或 结束 的行。此时,我的系列看起来像这样(为简洁起见,我省略了一些重复的值): 设置 这是我想要实现的( 理想情况下没有循环) 这是我尝试过的 通过对数据质量的一些乐观假设,我可以获得如下 事件编号 : 然后,我可以将其恢复到原始数据框,并使用 问题 如您所见,事件之间的时间(01:20到02:20)与事件#1相关联。