Я разрабатываю веб-приложение Django, развернутое на сервере Apache с WSGI, и все идет гладко. Сегодня я внес незначительные изменения в свое приложение, admin.py
пытаясь настроить встроенный интерфейс администратора Django, и сначала допустил синтаксическую ошибку (незакрытая скобка). Это означало, что когда я коснулся 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
Первая серия ошибок показывает, что WSGI не работает из-за синтаксической ошибки в my admin.py
. Однако вторая серия ошибок, похоже, показывает внутреннюю ошибку Django:
RuntimeError: populate() isn't reentrant
выброшено из populate
метода registry.py
.
Поиск в Google этого сообщения об ошибке возвращает на удивление мало информации, ни одной из документации 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.
источник
wsgi.py
к той же ошибке Apache, и файлы .pyc не создаются заново.Ответы:
Это вызвано ошибкой в ваших настройках Django. К сожалению, Django скрывает ошибку за этим общим и бесполезным сообщением об ошибке.
Чтобы выявить истинную проблему, откройте
django/apps/registry.py
строку 80 и замените:с участием:
Это позволит Django продолжить загрузку и выявить фактическую ошибку.
Я столкнулся с этой ошибкой по нескольким причинам. Однажды из-за того, что у меня был плохой импорт в одном из моих приложений admin.py.
источник
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
и исправил его.Администратор моего сервера перезапустил Apache, и это волшебным образом устранило эту проблему. Точно такие же файлы Python загружаются, не вызывая
populate() isn't reentrant
. Я даже попытался загрузить другой файл с синтаксической ошибкой, а затем исправить ее, и сервер смог загрузить новый файл и нормально работать без проблем.Я все еще не знаю, что пошло не так, но я отмечаю это как ответ, поскольку проблема исчезла. (Что ж, я отмечу его как ответ, как только StackOverflow позволит мне принять мой собственный ответ.)
Обновление : после того, как я продолжал получать эту ошибку, когда я случайно загружал Python с синтаксическими ошибками, я нашел обходной путь, который проще, чем перезапуск Apache. Когда WSGI начинает выдавать
populate() isn't reentrant
ошибку, я заменяю свой проект Djangowsgi.py
этой простой функцией:Затем я перезагружаю свой веб-сайт, и процесс демона WSGI перезапускается (что я могу сказать, просмотрев журнал Apache, хотя на веб-сайте по-прежнему отображается та же ошибка 500).
Если затем я
wsgi.py
вернусь к нормальному состоянию и снова перезагружу, WSGI успешно заберет мой код без выбросаpopulate() isn't reentrant
(при условии, что на этот раз у меня нет синтаксических ошибок). Таким образом, не нужно перезапускать весь Apache, только процесс WSGI, и я могу сделать это без привилегий root.источник
startup-timeout
более поздних версиях mod_wsgi есть опция для режима демона mod_wsgi, которая помогает в восстановлении после временных ошибок, когда Django инициализируется, например, когда база данных недоступна. Тайм-аут приведет к автоматическому перезапуску процесса, если приложение WSGI не загрузится должным образом после периода тайм-аута. Даже это не поможет, если у вас есть постоянная проблема с вашим собственным кодом. В этом случае ищите самую первую ошибку, а неpopulate()
ошибку, поскольку она укажет реальную причину сбоя вашего кода.Я знаю, что это старый ответ, но я внесу свой вклад в свое решение:
В качестве способа диагностики источника проблемы запустите
manage.py check
и посмотрите, найдете ли вы там что-нибудьВ моем случае проблема заключалась в устаревшем требовании, и django не мог импортировать подмодуль
Убедитесь, что ваши требования актуальны
источник
manage.py check
я обнаружил проблему. Спасибо.Это не ответ, а отражение.
Когда вы обновляетесь до django 1.7 и получаете ошибку 500 и перезагружаете страницу, Apache сообщает, что "populate () не повторяется". Я думаю, что когда вы загружаете свою страницу, Apache загружает все модули, необходимые для вашего приложения, и когда ошибка обрабатывается, он не выгружает модуль. Итак, когда вы перезагружаете свою страницу, apache снова загружает эти модули, но они уже загружены. Итак, apache говорит, что populate () не реентерабелен.
Есть два действия, чтобы исправить это: перезапустить apache или исправить ошибку, которая обрабатывает первую ошибку 5OO.
Попробуйте перезапустить apache с помощью:
Надеюсь, это вам поможет.
источник
Если вы получаете эту ошибку при использовании 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")
ошибка.источник
Вы можете исправить это без перезапуска Apache, прикоснувшись к файлу (кроме wsgi.py), который находится на ранней стадии процесса загрузки. Например, ваш файл настроек:
Я тоже не решил это должным образом, но больше информации в моем вопросе здесь: Мониторинг изменений кода неисправен с Django 1.7 на mod-wsgi
источник
Apache хранит файл wsgi в своем кеше. Отключить кеширование файлов Python в Apache
Итак, сначала удалите файл wsgi и перезапустите acpache, а затем снова добавьте файл wsgi и перезапустите apache.
источник
Я столкнулся с той же проблемой, поэтому начал осматриваться.
Теперь у меня это работает, поэтому я подумал, что должен поделиться им с вами, ребята!
Все, что я делал, это делал
chown user:group /to/path -R
иchmod 770 /to/path -R
все снова и снова, и это сработало.источник
Это похоже на хороший набор действительных ответов на ту же ошибку Apache mod-wsgi, каждый из которых публикует тот, который работает для него / нее, так что вот мой:
Не забудьте обновить требования к проекту после развертывания :)
источник
У меня возникла та же проблема, и источником ошибки для меня была просто синтаксическая ошибка в файле, с которым я работал. После исправления опечатки
populate() is not reentrant
ошибка исчезла.Если вы запускаете django из сценария wsgi, вы можете определить опечатку, просто запустив сценарий wsgi из командной строки. Например:
источник
Эта ошибка также возникает при несогласованном использовании пробела и табуляции в коде.
источник
Установка: Ubuntu 14.04, Django 1.10, Python 3.5 (in
virtualenv
).Я безуспешно пробовал многие из этих решений, но потом заметил, что в моем случае журнал ошибок Apache содержит две разные ошибки. Одно случается, когда кто-то пытается посетить страницу, другое - при запуске. Я пропустил запуск, потому что обычно я пытался обновить страницу пару раз и, таким образом, видел, что ошибка при посещении повторялась только несколько раз.
Затем я искал решения для ошибки запуска, и решение этого вопроса сработало для меня . Вкратце, это включает в себя обновление
mod_wsgi
пакета окольными путями.В течение нескольких месяцев я получал предупреждения о несоответствии
mod_wsgi
версий, но внезапно это привело к ошибке Apache 500's. Для меня это не имеет никакого смысла.Я предполагаю, что эта
RuntimeError: populate() isn't reentrant
ошибка обычно является признаком того, что следует искать ошибку запуска, которая указывает на настоящую проблему.в гостях
запускать
источник
populate()
и мне кажется, что это совершенно другая проблема, поэтому я не понимаю, как вы думаете, что она решала ту же проблему. Итак, насколько кто-либо может сказать, у вас была другая проблема, для которой вы должны были задать отдельный вопрос с самого начала, а не путать ответы здесь на то, что выглядит как другая проблема, основанная на деталях в том другом сообщении ..Я знаю, что этот вопрос был задан некоторое время назад, но я столкнулся с этой проблемой из-за проблемы, которую я здесь не видел. Я получал сообщение об
RuntimeError: populate() isn't reentrant
ошибке из-за SELinux в CentOS 7. У меня Django обслуживался из домашнего каталога, и мне просто пришлось включить логическое значение SELinux, которое позволяло читать домашние каталоги, поскольку ошибка populate () возникла из-за проблемы с разрешениями. Решение для меня былоsetsebool -P httpd_read_user_content 1
. Надеюсь, это поможет кому-то, у кого есть эта проблема.источник
chcon
изменив контекст проблемного.so
файла наhttpd_sys_script_exec_t
.Множество ответов проясняет; это общая ошибка, которая может иметь несколько основных причин, обычно связанных с загрузкой Apache / WSGI.
Все эти ответы на этой странице должны функционировать как своего рода контрольный список, и в этом ключе я хочу добавить основную причину моего экземпляра этой ошибки: отказ добавить «import os» в ваш файл settings.py.
В частности, в нашей команде был разработчик, который намеревался удалить ненужный пакет и вместо этого удалил «import os» из верхней части рабочего файла settings.py. После перезапуска apache наше приложение не перезапускалось, и мы получили ужасную ошибку «RuntimeError: populate () не повторяется».
Быстрая «проверка python manage.py» не выявила проблемы, но «python settings.py» обнаружила; пакет ОС не был загружен.
Если у вас есть эта ошибка, сосредоточьтесь на поиске файлов settings.py, а также файла WSGI.
источник
reentrant
только ошибку. В режиме демона также убедитесь, что вы используетеstartup-timeout
опцию, если у вас есть эта проблема из-за временных ошибок, а не ошибок кодирования. По крайней мере, так он может автоматически восстановиться.RuntimeError: populate() isn't reentrant
Может быть что угодно, поэтому на этот вопрос так много разных ответов.
Уловка заключается в том, чтобы просмотреть сообщение об ошибке непосредственно перед файлом
RuntimeError
. В вашем случае в файле /extra/www/htmlquotes/quotes_django/quotespage/admin.py в строке 15, похоже, есть синтаксическая ошибка, см.:источник
Примечание по AWS Elastic Beanstalk: значение по умолчанию
settings.py
, записанное Django-admin, включает ссылку на локальную базу данных sqlite в качестве источника данных. Скорее всего, это будет работать в вашей локальной ОС, но не в AWS EB, и приведет кpopulate() isn't reentrant
ошибке выполнения. Чтобы проверить это, просто закомментируйтеDATABASES={<...>}
операторsettings.py
, разверните и снова откройте приложение.источник
django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).
последует расширениеRuntimeError: populate() isn't reentrant
. Из документации AWS : «Django 2.2 несовместим с платформой Elastic Beanstalk Python 3.6». (на момент написания)У меня была эта проблема, и я не мог найти ответа, почему, пока не отказался от своих коммитов. По-видимому, я добавил случайный импорт из-за автозаполнения, который испортил настройку.
# found in models.py from msilib.schema import SelfReg
В журнале ошибок apache: RuntimeError ("populate () не повторяется")
Он отлично работал в моей среде разработки Windows, но не работал на сервере ubuntu / apache.
источник
Я столкнулся с той же ошибкой после изменения порядка этого параметра:
возвращение его в порядок здесь и перезапуск apache устранили проблему.
источник
В моем случае у меня был
custom renderer class
forDjango Rest Framework
, по какой-то причине мне пришлось переопределить метод класса рендерера "get_context" (полное раскрытие: чтобы сделатьdjango toolbar
дать правильное количество запросов SQL)Я удалил этот класс и развернул заново. Это сработало.
источник
В моем случае ошибка возникла из-за отсутствия необходимого пакета pip.
Итак, я
pip install -r requirements.txt
перезапустил apache, и все снова заработало.источник
Удаление каталога virtualenv, воссоздание virtualenv, а затем переустановка всех требований устранили это для меня.
источник
Добавление моей причины в список. Для меня это было потому, что у меня была служба django с тем же каталогом, что и каталог процесса. Переименование процесса / каталога устранило проблему.
источник
У меня была рекурсия
django.setup()
, например, я пытался написатьdjango.setup()
внутри anapp/models.py
, в трассировке стека django пытался указать на это рядом:так что да, не пытайтесь установить django во время установки django ...
источник
Для меня перезапуск сервера Apache решил проблему. Вы можете сделать это с помощью команды $ sudo service apache2 restart
источник
У меня была такая же проблема, у меня сработало комментирование настроек базы данных по умолчанию в / settings.py. Я также читал, что более поздние версии django несовместимы с ebs
источник
Для меня ошибка заключалась в отсутствии
mysqlclient
пакета в файле requirements.txt.Сначала я установил
mysqlclient
пакет с:затем я обновил файл requirements.txt следующим образом:
и это решило мою проблему.
источник
В моем случае у меня был циклический импорт, который вызывал ошибку, нарушающую метод заполнения.
источник
Чтобы бросить мои 2 евроцента:
Я воссоздал рабочую установку в Docker. Ошибка новой установки Docker:
что кажется общей ошибкой. В моем случае я пропустил это
устанавливает последнюю версию (
2.0
) вместо требуемой версии1.11
. Изменив это наисправил мою проблему.
источник
Я думаю, что это общая ошибка, когда что-то не так
settings.py
. Иногда я могу найти проблему методом проб и ошибок, удаляя установленные приложения по одному. В некоторых случаях это не связано с установленными приложениями. Но по моему опыту, во всех случаях проблема связана сsettings.py
файлом.источник
проверьте, не упоминали ли вы свои имена API дважды в разделе установленных приложений settings.py.
Определение приложения
Определение приложения
Удаление повторяющихся записей решило мою проблему
источник