Estou desenvolvendo uma aplicação web Django implantada em um servidor Apache com WSGI, e tudo corre bem. Hoje, eu fiz algumas pequenas alterações no meu aplicativo admin.py
na tentativa de personalizar a interface Django Admin embutida e inicialmente cometi um erro de sintaxe (um parêntese não fechado). Isso significa que, quando toquei wsgi.py
e carreguei o código (tenho WSGI em execução no modo daemon em meu host virtual), meu site foi substituído por um Erro interno do servidor porque o WSGI parou quando atingiu o erro de sintaxe.
Corrigi o erro de sintaxe, verifiquei se não tinha mais nenhum com manage.py check
e toquei wsgi.py
em reimplantar. Mas meu site ainda exibe um erro interno do servidor! Verificando os logs do Apache, isto é o que vejo:
[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
A primeira série de erros mostra falha de WSGI devido ao erro de sintaxe em my admin.py
. No entanto, a segunda série de erros parece mostrar um erro interno do Django:
RuntimeError: populate() isn't reentrant
jogado a partir do populate
método de registry.py
.
Pesquisar essa mensagem de erro no Google retorna surpreendentemente poucas informações, nenhuma delas da documentação do Django. Aparentemente, às vezes pode acontecer se você nomear um aplicativo duas vezes no seu settings.py
, mas não estou fazendo isso. Mais importante, não mudei settings.py
desde o ponto em que o site estava funcionando bem - a única coisa que mudei foi admin.py
.
Tentei reverter todas as alterações que fiz, para que todo o meu código Python volte ao estado em que estava quando o site estava funcionando - e ainda recebo o populate() isn't reentrant
erro quando tento fazer o WSGI recarregar o código!
Eu também tentei comentar diferentes aplicativos na seção INSTALLED_APPS de settings.py
, e mesmo com apenas 'django.contrib.staticfiles' habilitado, o erro ainda acontece. Estranhamente, ainda recebo o erro mesmo se comentar todos os aplicativos - o Django gera o erro mesmo quando não está carregando nenhum aplicativo!
Alguém sabe o que está acontecendo aqui? Ou alguma maneira melhor para eu depurar esse erro, já que o rastreamento no log do Apache é muito inútil?
Observações: Estou usando Django 1.7, Apache 2.2 e Python 2.7.
fonte
wsgi.py
resulta no mesmo erro do Apache, e os arquivos .pyc não são recriados.Respostas:
Isso é causado por um bug em algum lugar nas configurações do Django. Infelizmente, o Django está escondendo o bug por trás dessa mensagem de erro genérica e inútil.
Para revelar o verdadeiro problema, abra
django/apps/registry.py
e em torno da linha 80, substitua:com:
Isso permitirá que o Django continue carregando e revele o erro real.
Encontrei esse erro por várias causas diferentes. Uma vez foi porque tive uma importação incorreta em um dos admin.py do meu aplicativo.
fonte
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
e resolvi .O administrador do meu servidor reiniciou o Apache, e isso magicamente corrigiu o problema. Os mesmos arquivos Python carregados sem causar
populate() isn't reentrant
. Eu até tentei carregar outro arquivo com um erro de sintaxe, depois corrigi-lo, e o servidor conseguiu carregar o novo arquivo e funcionar corretamente sem problemas.Ainda não sei o que deu errado, mas estou marcando isso como respondido, pois o problema desapareceu. (Bem, vou marcá-lo como respondido assim que StackOverflow me permitir aceitar minha própria resposta.)
Atualização : depois de continuar a receber este erro quando acidentalmente carrego o Python com erros de sintaxe, descobri uma solução alternativa que é mais fácil do que reiniciar o Apache. Quando o WSGI começa a gerar o
populate() isn't reentrant
erro, substituo o do meu projeto Djangowsgi.py
por esta função simples:Então, eu recarrego meu site e o processo do daemon WSGI é reiniciado (o que posso dizer olhando o log do Apache, embora o site ainda exiba o mesmo erro 500).
Se eu mudar de
wsgi.py
volta para o normal e recarregar novamente, o WSGI pegará meu código com sucesso sem lançarpopulate() isn't reentrant
(assumindo que não tenho erros de sintaxe neste momento). Portanto, o Apache inteiro não precisa ser reiniciado, apenas o processo WSGI, e posso fazer isso sem privilégios de root.fonte
startup-timeout
opção para o modo daemon do mod_wsgi em versões mais recentes do mod_wsgi que auxilia na recuperação de erros transitórios quando o Django está sendo inicializado, como um banco de dados não disponível. O tempo limite fará com que o processo seja reiniciado automaticamente se o aplicativo WSGI não carregar corretamente após o período de tempo limite. Mesmo isso não ajudará quando você tiver um problema permanente com seu próprio código. Nesse caso, procure o primeiro erro, não opopulate()
erro, pois ele fornecerá o verdadeiro motivo da falha do código.Sei que essa é uma resposta antiga, mas vou contribuir com minha solução:
Como forma de diagnosticar a origem do problema, execute
manage.py check
e veja se você encontra algo láNo meu caso, um requisito desatualizado era o problema e o Django não conseguia importar um submódulo
Certifique-se de que seus requisitos estão atualizados
fonte
manage.py check
encontrei o problema. Obrigado.Não é uma resposta, mas uma reflexão.
Quando você atualiza para django 1.7 e você tem um erro 500 e recarrega sua página, o Apache diz "populate () não é reentrante". Eu acho que é quando você carrega sua página, o Apache carrega todos os módulos que você precisa para o seu aplicativo e quando o erro é resolvido ele não descarrega o módulo. Então, quando você recarregar sua página, o apache carrega novamente estes módulos, mas já está carregado. Então, o apache diz "populate () não é reentrante".
Tenho duas ações para corrigir isso: Reinicie o apache ou corrija o erro que manipulou o primeiro erro 5OO.
Tente reiniciar o apache com:
Espero que ajude você.
fonte
Se você estiver recebendo este erro ao usar o Google App Engine, verifique seus registros para outros erros que podem estar causando isso. Eu estava conseguindo:
ImproperlyConfigured: Error loading either pysqlite2 or sqlite3 modules (tried in that order): No module named _sqlite3
Você não pode usar o SQLite com o Google App Engine, portanto, comentar a
DATABASES
seção desettings.py
interrompeu esse erro e oRuntimeError("populate() isn't reentrant")
erro também.fonte
Você pode consertá-lo sem reiniciar o Apache tocando em um arquivo (diferente de wsgi.py) que está no início do processo de carregamento. Por exemplo, seu arquivo de configurações:
Eu também não resolvi isso adequadamente, mas mais informações na minha pergunta aqui: Monitoramento de alteração de código com defeito com Django 1.7 no mod-wsgi
fonte
O Apache armazena o arquivo wsgi em seu cache. Desative o armazenamento em cache do Apache de arquivos python
Portanto, primeiro exclua o arquivo wsgi e reinicie seu acpache e, em seguida, adicione o arquivo wsgi novamente e reinicie o apache.
fonte
Eu simplesmente enfrentei o mesmo problema, então comecei a procurar.
Agora que está funcionando, achei melhor compartilhar com vocês!
Tudo o que fiz foi fazer
chown user:group /to/path -R
echmod 770 /to/path -R
tudo de novo e funcionou.fonte
Esta parece ser uma boa coleção de respostas válidas para o mesmo erro do mod-wsgi do Apache, cada cara postando aquela que funciona para ele, então aqui está a minha:
Não se esqueça de atualizar os requisitos do seu projeto após a implantação :)
fonte
Eu tive esse mesmo problema, e a origem do erro para mim era apenas um erro de sintaxe em um arquivo com o qual eu estava trabalhando. Depois de corrigir o erro de digitação, o
populate() is not reentrant
erro desapareceu.Se você estiver executando o django a partir de um script wsgi, poderá identificar o erro de digitação apenas executando o script wsgi na linha de comando. Por exemplo:
fonte
Este erro também gerava se houvesse inconsistência no uso de espaço e tabulação no código.
fonte
Configuração: Ubuntu 14.04, Django 1.10, Python 3.5 (in
virtualenv
).Tentei muitas dessas soluções sem sorte, mas então percebi que o log de erros do Apache contém dois erros diferentes no meu caso. Um que acontece quando alguém tenta visitar uma página, outro que acontece na inicialização. Perdi a inicialização porque normalmente tentei atualizar a página algumas vezes e, portanto, só vi o erro na visita repetido algumas vezes.
Em seguida, procurei soluções para o erro de inicialização e a solução para essa questão funcionou para mim . Resumidamente, envolve atualizar o
mod_wsgi
pacote de forma indireta.Eu vinha recebendo avisos por meses sobre a incompatibilidade de
mod_wsgi
versões, mas de repente isso resultou em erro 500 do Apache. Não faz sentido para mim.Meu palpite é que esse
RuntimeError: populate() isn't reentrant
erro geralmente é um sinal de que se deve procurar um erro de inicialização, que indica o problema real.na visita
comece
fonte
populate()
problema de forma alguma e para mim parece um problema totalmente diferente, então não consigo ver como você acha que estava resolvendo o mesmo problema. Até onde qualquer um pode dizer, você teve um problema diferente para o qual deveria ter feito uma pergunta separada no início, em vez de confundir as respostas aqui para o que parece ser um problema diferente com base nos detalhes daquela outra postagem.Sei que já faz um tempo que essa pergunta foi feita, mas acabei de encontrar esse problema devido a um problema que não vi discutido aqui. Eu estava recebendo o
RuntimeError: populate() isn't reentrant
erro devido ao SELinux no CentOS 7. Eu tinha o Django servido fora de um diretório home e simplesmente tinha que habilitar o booleano SELinux que permitia a leitura de diretórios home, já que o erro populate () era devido a um problema de permissões. A solução para mim foisetsebool -P httpd_read_user_content 1
. Espero que isso ajude alguém com esse problema.fonte
chcon
para alterar o contexto do.so
arquivo com problema parahttpd_sys_script_exec_t
.A multidão de respostas deixa isso claro; este é um erro genérico que pode ter várias causas raiz, geralmente relacionadas ao carregamento do Apache / WSGI.
Todas essas respostas nesta página devem funcionar como uma espécie de lista de verificação e, nesse sentido, quero adicionar a causa raiz da minha instância desse erro: falha ao adicionar um 'import os' ao arquivo settings.py.
Especificamente, tínhamos um desenvolvedor em nossa equipe que pretendia remover um pacote desnecessário e, em vez disso, removeu 'import os' do início do arquivo settings.py de produção. Após uma reinicialização do apache, nosso aplicativo não reiniciou e recebemos o temido erro 'RuntimeError: populate () não é reentrante'.
Uma rápida 'verificação de python manage.py' não revelou o problema, mas um 'python settings.py' sim; o pacote do sistema operacional não foi carregado.
Se você tiver esse erro, concentre sua pesquisa na verificação de seu (s) arquivo (s) settings.py e também em seu arquivo WSGI.
fonte
reentrant
apenas o erro. No modo daemon, certifique-se também de usar astartup-timeout
opção se tiver esse problema devido a erros temporários, em vez de erros de codificação. Pelo menos assim ele pode se recuperar automaticamente.RuntimeError: populate() isn't reentrant
Pode ser qualquer coisa, por isso existem tantas respostas diferentes para essa pergunta.
O truque é examinar a mensagem de erro antes de
RuntimeError
. No seu caso, parece haver um erro de sintaxe no arquivo /extra/www/htmlquotes/quotes_django/quotespage/admin.py na linha 15, consulte:fonte
Nota sobre o AWS Elastic Beanstalk: O padrão
settings.py
que é escrito por Django-admin inclui uma referência a um banco de dados sqlite local como a fonte de dados. Isso provavelmente funcionará no seu sistema operacional local, mas não no AWS EB, e apresentará opopulate() isn't reentrant
erro de tempo de execução. Para testar isso, basta comentar aDATABASES={<...>}
instruçãosettings.py
, implantar e reabrir o aplicativo.fonte
django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).
seguido peloRuntimeError: populate() isn't reentrant
. Dos documentos da AWS : "Django 2.2 é incompatível com a plataforma Elastic Beanstalk Python 3.6." (no momento da escrita)Eu tive esse problema e não consegui encontrar nenhuma resposta até que eu retrocedesse meus commits. Aparentemente, eu adicionei uma importação acidental, por causa do preenchimento automático, que bagunçou a configuração.
# found in models.py from msilib.schema import SelfReg
No registro de erros do Apache: RuntimeError ("populate () não é reentrante")
Funcionou bem no meu ambiente Windows Dev, mas falhou no servidor ubuntu / apache.
fonte
Eu estava cometendo o mesmo erro depois de ter alterado a ordem dessa configuração:
colocá-lo de volta no pedido aqui antes e reiniciar o apache corrigiu o problema.
fonte
No meu caso, eu tinha um
custom renderer class
forDjango Rest Framework
, para alguma finalidade eu tive que substituir o método da classe renderizador "get_context" (divulgação completa: para fazerdjango toolbar
dar a contagem correta da consulta SQL)Eu removi essa classe e reimplantei. Funcionou.
fonte
No meu caso, o erro ocorreu porque um pacote pip requerido estava faltando.
Então eu fiz um
pip install -r requirements.txt
, reiniciei o apache e as coisas funcionaram novamente.fonte
Remover o diretório virtualenv, recriar o virtualenv e reinstalar todos os requisitos corrigidos para mim.
fonte
Adicionando meu motivo à lista. Para mim, foi porque eu tinha um serviço django nomeado com o mesmo diretório de um diretório de processo. Renomear o processo / dir corrigiu o problema.
fonte
Eu tinha um recursivo
django.setup()
, por exemplo, tentei escrever umdjango.setup()
dentro de umapp/models.py
, no django de rastreamento de pilha tentei apontar isso próximo a:então sim, certifique-se de não tentar configurar o django enquanto o django está sendo configurado ...
fonte
Reiniciar o servidor Apache para mim resolveu o problema. Você pode fazer isso usando o comando $ sudo service apache2 restart
fonte
Eu tive esse mesmo problema, o que funcionou para mim foi comentar as configurações de banco de dados padrão em / settings.py. Também li que as versões posteriores do Django não são compatíveis com o ebs
fonte
Para mim, o erro foi um
mysqlclient
pacote ausente no arquivo requirements.txt.Primeiro instalei o
mysqlclient
pacote com:então, atualizei o arquivo requirements.txt com:
e isso resolveu meu problema.
fonte
No meu caso, tive uma importação circular, que causou um erro que quebrou o método populate.
fonte
Para jogar meus 2 centavos de euro:
Recriei uma configuração de trabalho no Docker. A nova configuração do Docker falhou com
o que parece ser um erro genérico. No meu caso, esqueci que
instala a versão mais recente (
2.0
), em vez da versão necessária1.11
. Mudando isso paraconsertou meu problema.
fonte
Acho que é um erro genérico quando algo está errado
settings.py
. Às vezes, posso encontrar o problema por tentativa e erro, removendo os aplicativos instalados um de cada vez. Em alguns casos, não está relacionado aos aplicativos instalados. Mas, pela minha experiência, em todos os casos é um problema dentro dosettings.py
arquivo.fonte
verifique se você mencionou seus nomes de API duas vezes na seção de aplicativos instalados do settings.py.
Definição de aplicativo
Definição de aplicativo
Remover entradas duplicadas resolveu meu problema
fonte