[django] Django가 RuntimeError로 작동하지 않습니다 .Pulate () is n’t reentrant

WSGI를 사용하여 Apache 서버에 배포 된 Django 웹 애플리케이션을 개발해 왔으며 모든 것이 순조롭게 진행되었습니다. 오늘 저는 내장 admin.pyDjango 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

첫 번째 일련의 오류는 내 .NET의 구문 오류로 인해 WSGI가 실패했음을 보여줍니다 admin.py. 그러나 두 번째 일련의 오류는 Django 내부 오류를 표시하는 것 같습니다.

RuntimeError: populate() isn't reentrant

populate메서드 에서 던져졌습니다 registry.py.

이 오류 메시지를 검색하면 놀랍게도 거의 정보가 반환되지 않으며 Django 문서에서는 제공되지 않습니다. 분명히에서 앱의 이름을 두 번 지정하면 때때로 발생할 수 settings.py있지만 나는 그렇게하지 않습니다. 더 중요한 것은 settings.py웹 사이트가 잘 작동했던 시점 이후로 변경하지 않았습니다 admin.py. 내가 변경 한 유일한 것은 .

내가 만든 모든 변경 사항을 되돌리려 고했기 때문에 모든 Python 코드가 웹 사이트가 작동 할 때의 상태로 돌아 왔고 populate() isn't reentrantWSGI에서 코드를 다시로드하려고 할 때 여전히 오류가 발생합니다!

또한의 INSTALLED_APPS 섹션에서 다른 앱을 주석 처리하려고 시도했으며 settings.py‘django.contrib.staticfiles’만 활성화해도 오류가 계속 발생합니다. 이상하게도 모든 앱을 주석 처리해도 여전히 오류가 발생 합니다 . Django는 앱을로드하지 않아도 오류가 발생합니다!

여기에서 무슨 일이 일어나고 있는지 아는 사람이 있습니까? 아니면 아파치 로그의 역 추적이 거의 도움이되지 않기 때문에이 오류를 디버깅하는 더 좋은 방법이 있습니까?

참고 : Django 1.7, Apache 2.2 및 Python 2.7을 사용하고 있습니다.



답변

이것은 Django 설정 어딘가의 버그로 인해 발생합니다. 불행히도 장고는이 일반적이고 쓸모없는 오류 메시지 뒤에 버그를 숨기고 있습니다.

실제 문제를 나타내려면 django/apps/registry.py80 행을 열고 주위를 바꾸십시오.

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

와:

self.app_configs = {}

이렇게하면 Django가 계속로드되고 실제 오류가 표시됩니다.

여러 가지 원인으로이 오류가 발생했습니다. 한 번은 내 앱의 admin.py 중 하나에 잘못된 가져 오기가 있었기 때문입니다.


답변

내 서버의 관리자가 Apache를 다시 시작했고이 문제가 마술처럼 해결되었습니다. 정확히 동일한 Python 파일이 populate() isn't reentrant. 구문 오류가있는 다른 파일을로드 한 다음 수정하려고했는데 서버가 새 파일을로드하고 문제없이 올바르게 실행할 수있었습니다.

나는 아직도 무엇이 잘못되었는지 모르겠지만 문제가 사라졌기 때문에 이것을 답변으로 표시하고 있습니다. (글쎄, StackOverflow가 내 답변을 수락 할 수있게하자마자 답변 됨으로 표시하겠습니다.)

업데이트 : 실수로 구문 오류가있는 Python을 업로드 할 때이 오류가 계속 발생한 후 Apache를 다시 시작하는 것보다 쉬운 해결 방법을 찾았습니다. WSGI가 populate() isn't reentrant오류를 던지기 시작하면 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 데몬 프로세스가 다시 시작됩니다 (웹 사이트에 여전히 동일한 500 오류가 표시 되더라도 Apache 로그를 보면 알 수 있음).

그런 다음 wsgi.py다시 정상으로 변경 하고 다시로드하면 WSGI는 던지지 않고 코드를 성공적으로 선택합니다 populate() isn't reentrant(이번에는 구문 오류가 없다고 가정). 따라서 Apache 전체를 다시 시작할 필요가없고 WSGI 프로세스 만 있으면 루트 권한 없이도이를 수행 할 수 있습니다.


답변

나는 이것이 오래된 대답이라는 것을 알고 있지만 내 솔루션에 기여할 것입니다.

문제의 원인을 진단하고 manage.py check거기에서 찾은 것이 있는지 확인하는 방법으로

제 경우에는 오래된 요구 사항이 문제 였고 django는 하위 모듈을 가져 오지 못했습니다.

요구 사항이 최신 상태인지 확인


답변

반응이 아니라 반영입니다.

django 1.7로 업그레이드 할 때 500 오류가 발생하고 페이지를 다시로드하면 Apache는 “populate ()가 재진입이 아닙니다”라고 말합니다. 페이지를로드 할 때 Apache가 앱에 필요한 모든 모듈을로드하고 오류가 처리되면 모듈을 언로드하지 않습니다. 따라서 페이지를 다시로드 할 때 아파치는 이러한 모듈을 다시로드하지만 이미로드되었습니다. 그래서 아파치는 “populate ()는 재진입이 아닙니다”라고 말합니다.

이 문제를 해결하기위한 두 가지 조치가 있습니다. 아파치를 다시 시작하거나 첫 번째 5OO 오류를 처리하는 오류를 수정합니다.

다음을 사용하여 아파치를 다시 시작하십시오.

sudo service httpd restart

도움이 되길 바랍니다.


답변

Google App Engine을 사용할 때이 오류가 발생하면 로그에서 원인이 될 수있는 다른 오류를 확인하세요. 나는 얻고 있었다 :

ImproperlyConfigured: Error loading either pysqlite2 or sqlite3 modules (tried in that order): No module named _sqlite3

Google App Engine과 함께 SQLite를 사용할 수 없으므로 해당 오류 및 오류 DATABASESsettings.py중지하는 섹션을 주석 처리하십시오 RuntimeError("populate() isn't reentrant").


답변

로딩 프로세스의 초기에있는 파일 (wsgi.py 제외)을 터치하여 Apache를 다시 시작하지 않고도 수정할 수 있습니다. 예를 들어, 설정 파일 :

$ touch settings.py

나는 이것을 제대로 해결하지 못했지만 여기 내 질문에 더 많은 정보가 있습니다 .mod-wsgi에서 Django 1.7에서 코드 변경 모니터링이 오작동합니다.


답변

Apache는 wsgi 파일을 캐시에 저장합니다.
Python 파일의 Apache 캐싱 비활성화

따라서 먼저 wsgi 파일을 삭제하고 acpache를 다시 시작한 다음 wsgi 파일을 다시 추가하고 apache를 다시 시작하십시오.