Edw*_*ard 88 apache django mod-wsgi django-wsgi
我一直在使用WSGI开发部署在Apache服务器上的Django Web应用程序,一切都进展顺利.今天,我对我的应用程序进行了一些小的更改,admin.py试图自定义内置的Django Admin界面,并且最初产生了语法错误(一个未闭合的括号).这意味着当我触摸wsgi.py并加载代码时(我在我的虚拟主机上以守护进程模式运行WSGI),我的网站被替换为内部服务器错误,因为WSGI在遇到语法错误时停止了.
所以我修复了语法错误,检查了我没有更多manage.py check,并触及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
Run Code Online (Sandbox Code Playgroud)
由于我的语法错误,第一系列错误显示WSGI失败admin.py.但是,第二系列错误似乎表明Django内部存在错误:
RuntimeError: populate() isn't reentrant
Run Code Online (Sandbox Code Playgroud)
抛出的populate方法registry.py.
谷歌搜索此错误消息令人惊讶的回报很少,没有来自Django文档.显然,如果您在应用程序中为应用程序命名两次,有时会发生这种情况settings.py,但我不是这样做的.更重要的是,settings.py自从网站工作正常以来我没有改变- 我唯一改变的是admin.py.
我尝试恢复我所做的所有更改,所以我的所有Python代码都恢复到网站工作时的状态 - populate() isn't reentrant当我尝试让WSGI重新加载代码时,我仍然会收到错误!
我还尝试在INSTALLED_APPS部分中注释掉不同的应用程序settings.py,即使只启用了"django.contrib.staticfiles",错误仍然会发生.奇怪的是,即使我注释掉所有应用程序,我仍然会收到错误- 即使没有加载任何应用程序,Django也会抛出错误!
有谁知道这里发生了什么?或者我调试此错误的更好方法,因为Apache日志中的回溯非常无益?
注意:我正在使用Django 1.7,Apache 2.2和Python 2.7.
Edw*_*ard 59
我的服务器管理员重新启动了Apache,这神奇地解决了这个问题.加载完全相同的Python文件而不会导致populate() isn't reentrant.我甚至尝试加载另一个带有语法错误的文件,然后修复它,服务器能够加载新文件并正确运行而没有任何问题.
我仍然不知道出了什么问题,但是由于问题已经消失,我将此标记为已回答.(好吧,一旦StackOverflow允许我接受我自己的答案,我会将其标记为已回答.)
更新:在我意外上传带有语法错误的Python后继续出现此错误后,我想出了一个比重启Apache更容易的解决方法.当WSGI开始抛出populate() isn't reentrant错误时,我wsgi.py用这个简单的函数替换我的Django项目:
def application(environ, start_response):
if environ['mod_wsgi.process_group'] != '':
import signal
os.kill(os.getpid(), signal.SIGINT)
return ["killed"]
Run Code Online (Sandbox Code Playgroud)
然后我重新加载我的网站,并重新启动WSGI守护进程(我可以通过查看Apache日志来判断,即使网站仍然显示相同的500错误).
如果我然后再wsgi.py恢复正常并重新加载,WSGI成功地获取我的代码而不抛出populate() isn't reentrant(假设这次我没有语法错误).所以整个Apache不需要重启,只需要重启WSGI进程,而且我可以在没有root权限的情况下完成.
Jes*_*mez 36
我知道这是一个陈旧的答案,但我会为我的解决方案做出贡献:
作为一种诊断问题来源的方法manage.py check,看看你是否发现了什么
在我的情况下,过时的要求是问题,并且django未能导入子模块
确保您的要求是最新的
Cer*_*rin 29
这是由您的Django设置中的某个错误引起的。不幸的是,Django将该错误隐藏在此通用且无用的错误消息背后。
为了揭示真正的问题,打开django/apps/registry.py并围绕80行,替换:
raise RuntimeError("populate() isn't reentrant")
Run Code Online (Sandbox Code Playgroud)
与:
self.app_configs = {}
Run Code Online (Sandbox Code Playgroud)
这将允许Django继续加载,并显示实际错误。
我因几种不同的原因遇到了此错误。曾经是因为我的一个应用程序admin.py中导入错误。
小智 17
这不是回应,而是反思。
当您升级到 django 1.7 并且出现 500 错误并重新加载页面时,Apache 会提示“populate() 不可重入”。我认为是当您加载页面时,Apache 会加载您的应用程序所需的所有模块,并且当错误得到处理时,它不会卸载模块。因此,当您重新加载页面时,apache 会再次加载这些模块,但它已经加载了。所以,apache 说“populate() 不是可重入的”。
我有两个措施来纠正这个问题:重新启动 apache,或者纠正处理第一个 5OO 错误的错误。
尝试使用以下命令重新启动 apache:
sudo service httpd restart
Run Code Online (Sandbox Code Playgroud)
我希望它会帮助你。
如果您在使用Google App Engine时遇到此错误,请检查日志中是否存在可能导致此问题的其他错误.我得到了:
ImproperlyConfigured: Error loading either pysqlite2 or sqlite3 modules (tried in that order): No module named _sqlite3
您不能将SQLite与Google App Engine一起使用,因此请注释掉DATABASES已settings.py停止该错误和RuntimeError("populate() isn't reentrant")错误的部分.
| 归档时间: |
|
| 查看次数: |
66519 次 |
| 最近记录: |