Pracowałem nad aplikacją internetową Django wdrożoną na serwerze Apache z WSGI i wszystko szło gładko. Dzisiaj dokonałem kilku drobnych zmian w mojej aplikacji, admin.py
próbując dostosować wbudowany interfejs Django Admin i początkowo popełniłem błąd składni (niezamknięty nawias). Oznaczało to, że kiedy dotknąłem wsgi.py
i załadowałem kod (mam WSGI działające w trybie demona na moim wirtualnym hoście), moja witryna została zastąpiona wewnętrznym błędem serwera, ponieważ WSGI zatrzymał się, gdy napotkał błąd składni.
Więc naprawiłem błąd składni, sprawdziłem, czy nie mam więcej z manage.py check
i dotknąłem, wsgi.py
aby ponownie wdrożyć. Ale moja witryna nadal wyświetla wewnętrzny błąd serwera! Sprawdzając dzienniki Apache, widzę to:
[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
Pierwsza seria błędów pokazuje niepowodzenie WSGI z powodu błędu składni w my admin.py
. Jednak druga seria błędów wydaje się wskazywać błąd wewnętrzny Django:
RuntimeError: populate() isn't reentrant
wyrzucony z populate
metody registry.py
.
Wyszukiwanie w Google tego komunikatu o błędzie zwraca zaskakująco mało informacji, z których żadna nie pochodzi z dokumentacji Django. Najwyraźniej może się to czasami zdarzyć, jeśli dwukrotnie nadasz aplikacji nazwę settings.py
, ale nie robię tego. Co ważniejsze, nie zmieniłem się settings.py
od momentu, w którym strona działała dobrze - jedyne, co zmieniłem, to admin.py
.
Próbowałem cofnąć wszystkie zmiany, które wprowadziłem, więc cały mój kod Pythona powrócił do stanu, w jakim działała witryna - i nadal populate() isn't reentrant
pojawia się błąd, gdy próbuję ponownie załadować kod WSGI!
Próbowałem także komentować różne aplikacje w sekcji INSTALLED_APPS settings.py
, a nawet przy włączonym tylko „django.contrib.staticfiles” błąd nadal się pojawia. Co dziwne, nadal otrzymuję błąd, nawet jeśli skomentuję wszystkie aplikacje - Django zgłasza błąd, nawet jeśli nie ładuje żadnych aplikacji!
Czy ktoś wie, co się tutaj dzieje? Czy może jakikolwiek lepszy sposób na zdebugowanie tego błędu, ponieważ śledzenie w dzienniku Apache jest dość nieprzydatne?
Uwagi: używam Django 1.7, Apache 2.2 i Python 2.7.
źródło
wsgi.py
powoduje ten sam błąd Apache, a pliki .pyc nie są odtwarzane.Odpowiedzi:
Jest to spowodowane błędem gdzieś w ustawieniach Django. Niestety, Django ukrywa błąd za tym ogólnym i nieprzydatnym komunikatem o błędzie.
Aby ujawnić prawdziwy problem, otwórz
django/apps/registry.py
i wokół linii 80, wymień:z:
Pozwoli to Django kontynuować ładowanie i ujawnić rzeczywisty błąd.
Napotkałem ten błąd z kilku różnych powodów. Kiedyś było tak, ponieważ miałem zły import w jednym z plików admin.py mojej aplikacji.
źródło
django.core.exceptions.ImproperlyConfigured: psycopg2_version 2.5.4 or newer is required; you have 2.5 (dt dec pq3 ext)
pip install --upgrade psycopg2
i to naprawiło.Administrator mojego serwera ponownie uruchomił Apache, co w magiczny sposób rozwiązało problem. Te same pliki Pythona zostały załadowane bez powodowania
populate() isn't reentrant
. Próbowałem nawet załadować inny plik z błędem składni, a następnie go naprawić, a serwer był w stanie załadować nowy plik i działać poprawnie bez żadnych problemów.Nadal nie wiem, co się stało, ale oznaczam to jako odpowiedź, ponieważ problem zniknął. (Cóż, oznaczę to jako odpowiedź, gdy tylko StackOverflow pozwoli mi zaakceptować moją własną odpowiedź.)
Aktualizacja : Po dalszym wyświetlaniu tego błędu, gdy przypadkowo przesyłam Pythona z błędami składniowymi, znalazłem obejście, które jest łatwiejsze niż ponowne uruchomienie Apache. Kiedy WSGI zaczyna zgłaszać
populate() isn't reentrant
błąd, zastępuję mój projekt Djangowsgi.py
tą prostą funkcją:Następnie ponownie ładuję moją witrynę i ponownie uruchamia się proces demona WSGI (co mogę stwierdzić, patrząc na dziennik Apache, mimo że witryna nadal wyświetla ten sam błąd 500).
Jeśli następnie
wsgi.py
powrócę do normalnego i ponownie załaduję, WSGI pomyślnie pobierze mój kod bez rzucaniapopulate() isn't reentrant
(zakładając, że tym razem nie mam błędów składniowych). Nie trzeba więc restartować całego Apache, tylko proces WSGI i mogę to zrobić bez uprawnień roota.źródło
startup-timeout
nowszych wersjach mod_wsgi dostępna jest opcja trybu demona mod_wsgi, która pomaga w usuwaniu błędów przejściowych podczas inicjalizacji Django, takich jak niedostępność bazy danych. Limit czasu spowoduje automatyczne ponowne uruchomienie procesu, jeśli aplikacja WSGI nie załaduje się poprawnie po upływie limitu czasu. Nawet to nie pomoże, gdy masz stały problem z własnym kodem. W takim przypadku szukaj pierwszego błędu, a niepopulate()
błędu, ponieważ poda on prawdziwy powód niepowodzenia kodu.Wiem, że to stara odpowiedź, ale przyczynię się do mojego rozwiązania:
Aby zdiagnozować źródło problemu, uruchom
manage.py check
i sprawdź, czy coś tam znajdzieszW moim przypadku problemem był przestarzały wymóg, a django nie mógł zaimportować modułu podrzędnego
Upewnij się, że Twoje wymagania są aktualne
źródło
manage.py check
znalazłem problem. Dziękuję Ci.To nie jest odpowiedź, ale refleksja.
Kiedy aktualizujesz do django 1.7 i pojawia się błąd 500 i ponownie ładujesz stronę, Apache mówi „populate () nie jest ponownie wprowadzany”. Myślę, że to kiedy ładujesz swoją stronę, Apache ładuje wszystkie moduły potrzebne do twojej aplikacji, a kiedy błąd jest obsługiwany, nie rozładowuje modułu. Więc kiedy przeładujesz swoją stronę, apache załaduje ponownie te moduły, ale jest już załadowany. Tak więc apache mówi, że „populate () nie jest ponownie wprowadzany”.
Mam dwie czynności, aby to naprawić: Zrestartuj Apache lub popraw błąd, który obsługuje pierwszy błąd 5OO.
Spróbuj ponownie uruchomić Apache za pomocą:
Mam nadzieję, że ci to pomoże.
źródło
Jeśli otrzymujesz ten błąd podczas korzystania z Google App Engine, sprawdź dzienniki pod kątem innych błędów, które mogą go powodować. Dostawałem:
ImproperlyConfigured: Error loading either pysqlite2 or sqlite3 modules (tried in that order): No module named _sqlite3
Nie możesz używać SQLite z Google App Engine, więc zakomentuj
DATABASES
sekcjęsettings.py
zatrzymania tego błędu, a takżeRuntimeError("populate() isn't reentrant")
błąd.źródło
Możesz to naprawić bez ponownego uruchamiania Apache, dotykając pliku (innego niż wsgi.py), który jest na wczesnym etapie procesu ładowania. Na przykład plik ustawień:
Również tego nie rozwiązałem poprawnie, ale więcej informacji w moim pytaniu tutaj: Monitorowanie zmiany kodu nie działa z Django 1.7 na mod-wsgi
źródło
Apache przechowuje plik wsgi w swojej pamięci podręcznej. Wyłącz buforowanie plików Pythona przez Apache
Więc najpierw usuń plik wsgi i zrestartuj swój acpache, a następnie dodaj ponownie plik wsgi i zrestartuj apache.
źródło
Właśnie stanąłem przed tym samym problemem, więc zacząłem się rozglądać.
Teraz to działa, więc pomyślałem, że powinienem się tym z wami podzielić!
Wszystko zrobiłem było zrobić
chown user:group /to/path -R
ichmod 770 /to/path -R
wszystko od nowa i to działało.źródło
Wygląda to na niezłą kolekcję prawidłowych odpowiedzi na ten sam błąd mod-wsgi Apache, każdy facet publikuje ten, który działa dla niego / niej, więc oto moje:
Nie zapomnij zaktualizować wymagań dotyczących projektu po wdrożeniu :)
źródło
Doświadczyłem tego samego problemu, a źródłem błędu był dla mnie po prostu błąd składni w pliku, z którym pracowałem. Po poprawieniu literówki
populate() is not reentrant
błąd zniknął.Jeśli uruchamiasz django ze skryptu wsgi, możesz być w stanie zidentyfikować literówkę, uruchamiając skrypt wsgi z wiersza poleceń. Na przykład:
źródło
Ten błąd jest również generowany w przypadku niespójnego wykorzystania spacji i tabulacji w kodzie.
źródło
Instalacja: Ubuntu 14.04, Django 1.10, Python 3.5 (in
virtualenv
).Próbowałem wielu z tych rozwiązań bez powodzenia, ale potem zauważyłem, że dziennik błędów Apache zawiera dwa różne błędy w moim przypadku. Jedna, która ma miejsce, gdy ktoś próbuje odwiedzić stronę, a druga ma miejsce podczas uruchamiania. Przegapiłem ten startowy, ponieważ zwykle próbowałem kilkakrotnie odświeżyć stronę i dlatego błąd podczas wizyty powtarzał się tylko kilka razy.
Następnie zamiast tego szukałem rozwiązań błędu uruchamiania i rozwiązanie tego pytania zadziałało . Krótko mówiąc, polega na
mod_wsgi
okrężnej aktualizacji pakietu.Od miesięcy otrzymywałem ostrzeżenia o niezgodności
mod_wsgi
wersji, ale nagle spowodowało to błąd Apache 500. Nie ma to dla mnie żadnego sensu.Domyślam się, że ten
RuntimeError: populate() isn't reentrant
błąd jest zwykle znakiem, że należy szukać błędu uruchamiania, który wskazuje na rzeczywisty problem.podczas wizyty
rozpocząć
źródło
populate()
problemie i wydaje mi się, że jest to zupełnie inny problem, więc nie widzę, jak myślisz, jak rozwiązał ten sam problem. Tak więc, o ile ktokolwiek może stwierdzić, miałeś inny problem, dla którego powinieneś był zadać osobne pytanie na początku, zamiast mylić odpowiedzi tutaj, co wygląda na inny problem w oparciu o szczegóły w tym innym poście.Wiem, że minęło trochę czasu, odkąd zadano to pytanie, ale właśnie napotkałem ten problem z powodu problemu, którego tutaj nie widziałem. Otrzymałem
RuntimeError: populate() isn't reentrant
błąd z powodu SELinux na CentOS 7. Miałem Django obsługiwane z katalogu domowego i po prostu musiałem włączyć wartość logiczną SELinux, która pozwalała na czytanie katalogów domowych, ponieważ błąd populate () był spowodowany problemem z uprawnieniami. Rozwiązaniem dla mnie byłosetsebool -P httpd_read_user_content 1
. Mam nadzieję, że pomoże to komuś, kto ma ten problem.źródło
chcon
do zmiany kontekstu.so
pliku powodującego problem nahttpd_sys_script_exec_t
.Mnogość odpowiedzi wyjaśnia to; jest to ogólny błąd, który może mieć wiele głównych przyczyn, zwykle związanych z ładowaniem Apache / WSGI.
Wszystkie te odpowiedzi na tej stronie powinny funkcjonować jako rodzaj listy kontrolnej iw tym duchu chcę dodać główną przyczynę mojego wystąpienia tego błędu: niepowodzenie dodania „importu systemu operacyjnego” do pliku settings.py.
W naszym zespole mieliśmy programistę, który zamierzał usunąć niepotrzebny pakiet i zamiast tego usunął polecenie „import os” z początku pliku settings.py produkcyjnego. Po ponownym uruchomieniu Apache nasza aplikacja nie uruchomiła się ponownie i otrzymaliśmy przerażający błąd „RuntimeError: populate () not reentrant”.
Szybkie „python manage.py check” nie ujawniło problemu, ale „python settings.py” tak; pakiet systemu operacyjnego nie został załadowany.
Jeśli masz ten błąd, skoncentruj swoje wyszukiwanie na sprawdzeniu plików settings.py, a także pliku WSGI.
źródło
reentrant
tylko błąd. W trybie demona upewnij się, że używaszstartup-timeout
opcji, jeśli masz ten problem z powodu przejściowych błędów, a nie błędów kodowania. Przynajmniej w ten sposób może automatycznie odzyskać.RuntimeError: populate() isn't reentrant
Może być cokolwiek, dlatego jest tak wiele różnych odpowiedzi na to pytanie.
Sztuczka polega na spojrzeniu na komunikat o błędzie tuż przed
RuntimeError
. W twoim przypadku wydaje się, że w pliku /extra/www/htmlquotes/quotes_django/quotespage/admin.py w linii 15 jest błąd składniowy, zobacz:źródło
Uwaga dotycząca AWS Elastic Beanstalk: Domyślnie
settings.py
napisane przez Django-admin zawiera odniesienie do lokalnej bazy danych sqlite jako źródła danych. Prawdopodobnie zadziała to na twoim lokalnym systemie operacyjnym, ale nie na AWS EB i spowodujepopulate() isn't reentrant
błąd w czasie wykonywania. Aby to sprawdzić, po prostu zakomentujDATABASES={<...>}
instrukcję wsettings.py
, wdróż i ponownie otwórz aplikację.źródło
django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).
śledzony przezRuntimeError: populate() isn't reentrant
. Z dokumentacji AWS : „Django 2.2 jest niekompatybilne z platformą Elastic Beanstalk Python 3.6”. (w czasie pisania)Miałem ten problem i nie mogłem znaleźć żadnej odpowiedzi, dopóki nie wycofałem swoich zatwierdzeń. Najwyraźniej dodałem przypadkowy import z powodu automatycznego uzupełniania, który zepsuł konfigurację.
# found in models.py from msilib.schema import SelfReg
W dzienniku błędów Apache: RuntimeError („populate () nie jest ponownie”)
Działało dobrze w moim środowisku deweloperskim Windows, ale nie działało na serwerze Ubuntu / Apache.
źródło
Miałem ten sam błąd po zmianie kolejności tego ustawienia:
przywrócenie go do porządku tutaj przed i ponowne uruchomienie Apache rozwiązało problem.
źródło
W moim przypadku miałem
custom renderer class
forDjango Rest Framework
, w jakimś celu musiałem przesłonić metodę klasy renderowania "get_context" (pełne ujawnienie: abydjango toolbar
podać poprawną liczbę zapytań SQL)Usunąłem tę klasę i ponownie wdrożyłem. Zadziałało.
źródło
W moim przypadku błąd wystąpił z powodu braku wymaganego pakietu pip.
Zrobiłem więc
pip install -r requirements.txt
, zrestartowałem apache i wszystko znowu działało.źródło
Usunięcie katalogu virtualenv, ponowne utworzenie virtualenv, a następnie ponowna instalacja wszystkich wymagań naprawiło to za mnie.
źródło
Dodanie powodu do listy. Dla mnie było tak, ponieważ miałem usługę django o nazwie z tym samym katalogiem, co katalog procesu. Zmiana nazwy procesu / katalogu rozwiązała problem.
źródło
Miałem rekurencyjny
django.setup()
, np. Próbowałem napisać adjango.setup()
wewnątrz aapp/models.py
, w śladzie stosu django próbował wskazać to w pobliżu:więc tak, pamiętaj, aby nie próbować konfigurować django podczas konfigurowania django ...
źródło
Ponowne uruchomienie serwera Apache rozwiązało problem. Możesz to zrobić za pomocą polecenia $ sudo service apache2 restart
źródło
Miałem ten sam problem, co zadziałało, to wykomentowanie domyślnych ustawień bazy danych w / settings.py. Czytałem również, że późniejsze wersje django nie są kompatybilne z ebs
źródło
U mnie błędem był brakujący
mysqlclient
pakiet w pliku Requirements.txt.Najpierw zainstalowałem
mysqlclient
pakiet z:następnie zaktualizowałem plik Requirements.txt o:
i to rozwiązało mój problem.
źródło
W moim przypadku miałem cykliczny import, który powoduje błąd, który przerywa metodę populate.
źródło
Aby dorzucić moje 2 centy:
Odtworzyłem działającą konfigurację w Dockerze. Nowa konfiguracja platformy Docker nie powiodła się
co wydaje się być ogólnym błędem. W moim przypadku to przeoczyłem
instaluje najnowszą wersję (
2.0
) zamiast wymaganej wersji1.11
. Zmieniam to nanaprawił mój problem.
źródło
Myślę, że to ogólny błąd, gdy coś jest nie tak
settings.py
. Czasami mogę znaleźć problem metodą prób i błędów, usuwając zainstalowane aplikacje pojedynczo. W niektórych przypadkach nie jest to związane z zainstalowanymi aplikacjami. Ale z mojego doświadczenia we wszystkich przypadkach jest to problem wsettings.py
pliku.źródło
sprawdź, czy dwa razy wymieniłeś nazwy swoich api w sekcji zainstalowanej aplikacji settings.py.
Definicja aplikacji
Definicja aplikacji
Usunięcie zduplikowanych wpisów rozwiązało mój problem
źródło