Django populate() не реентерируем
Я продолжаю получать это, когда пытаюсь загрузить свое приложение Django в производство. Я перепробовал все ответы на stackru, но ничего не устранило. Любые другие идеи. (Я использую Django 1.5.2 и Apache)
Traceback (most recent call last):
File "/var/www/thehomeboard/wwwhome/wsgi.py", line 37, in <module>
application = get_wsgi_application()
File "/usr/local/lib/python2.7/dist-packages/django/core/wsgi.py", line 14, in get_wsgi_application
django.setup()
File "/usr/local/lib/python2.7/dist-packages/django/__init__.py", line 18, in setup
apps.populate(settings.INSTALLED_APPS)
File "/usr/local/lib/python2.7/dist-packages/django/apps/registry.py", line 78, in populate
raise RuntimeError("populate() isn't reentrant")
RuntimeError: populate() isn't reentrant
7 ответов
В итоге проблема, с которой я столкнулся, заключалась в том, что я попытался запустить второе приложение Django, и в моей конфигурации apache не было указано следующее:
WSGIDaemonProcess ...
WSGIProcessGroup ...
Только что узнал, что вы можете запустить одно приложение django, не определяя их, но когда его два, это вызывает конфликт.
Эта RuntimeError впервые произошла для меня после обновления до Django 1.7 (и до сих пор присутствует в Django 1.8). Обычно это вызвано приложением Django, которое вызывает ошибку, но эта ошибка каким-то образом проглатывается.
Вот обходной путь, который работает для меня. Добавьте его в свой wsgi.py, и должна быть зарегистрирована настоящая ошибка:
import os
import time
import traceback
import signal
import sys
from django.core.wsgi import get_wsgi_application
try:
application = get_wsgi_application()
print 'WSGI without exception'
except Exception:
print 'handling WSGI exception'
# Error loading applications
if 'mod_wsgi' in sys.modules:
traceback.print_exc()
os.kill(os.getpid(), signal.SIGINT)
time.sleep(2.5)
Смотрите эту ветку на modwsgi для более подробной информации.
Будет много причин для причин populate() isn't reentrant
ошибка. Если вы посмотрите на registry.py
в вашем приложении в Django, вероятно, в этом каталоге/python2.7/site-packages/django/apps
# app_config should be pristine, otherwise the code below won't
# guarantee that the order matches the order in INSTALLED_APPS.
if self.app_configs:
raise RuntimeError("populate() isn't reentrant")
Как вы видите в комментарии, app_config должен быть нетронутым. Это означает, что если одна из конфигураций неверна или необходимая библиотека отсутствует, то возникнет эта ошибка заполнения. Я получил эту ошибку, потому что я пропустил установку sqlite. Даже если вы видите, что в исключении нет упоминания возможных причин. Я установил sqlite этой командой на debian
pip install pysqlite
Это решило мою проблему. Мое исключение из-за отсутствия pysqlite. Возможно, у вас отсутствуют другие необходимые пакеты или ошибки в вашем settings.py
Для тех, кто использует AWS Lambda (и, возможно, использует zappa), это может произойти, когда размер кода и зависимостей, заархивированных в пакет развертывания, после распаковки превышает 250 МБ.
Как правило, размер zip-файла может составлять всего 50 МБ, но он может разархивироваться до размера более 250 МБ, поэтому вам может потребоваться вручную разархивировать пакет развертывания, чтобы убедиться, что он не слишком большой при распаковке.
Полное раскрытие - ошибки "populate() не повторяются" могут иметь несколько причин, и проверка любых недавних изменений конфигурации или программы - очень хорошая идея.
Однако эта ошибка также может возникать при обновлении Apache, и модуль больше не является допустимым / поврежден / нуждается в обновлении. Это произошло с нами в Webfaction после обновления Apache (но может произойти на любом хосте).
Использование скрипта перезапуска Apache НЕ поможет этому, потому что модули остаются загруженными при перезапуске. Это может помочь в зависимости от вашей системы и от того, кэшированы ли моды, даже когда Apache выключен.
Полностью остановите Apache. На веб-фракции это:
~/webapps/<YOUR WEB APP>/apache2/bin/stop
Подождите несколько секунд, а затем...
~/webapps/<YOUR WEB APP>/apache2/bin/start
Это должно исправить проблему. Если ваша система кеширует моды, вам может потребоваться очистить кеш перед запуском.
Надеюсь это поможет!
Вот ссылка, которую они дали мне (я знаю, что ошибка другая, но у нас это произошло по той же причине с ошибкой заполнения):
Для меня эта ошибка была вызвана, потому что я не правильно разделить мой INSTALLED_APPS
для местного и производственного. Смысл в местном я использовал django-cors-headers
а в производстве я не был. Но я случайно ушел django-cors-headers
хотя я снял его с производства requirements.txt
, После удаления cors-headers
из установленных приложений в производстве ошибка ушла.
Я понял, много комментариев было о скрытой проблеме, значит
populate() не является реентерабельным
это не оригинальная проблема. В моем случае я изменил пароль в локальной БД для основного пользователя и забыл изменить настройки БД в другом проекте.