J'ai développé une application web Django déployée sur un serveur Apache avec WSGI, et tout s'est bien passé. Aujourd'hui, j'ai apporté quelques modifications mineures à mon application pour admin.py
tenter de personnaliser l'interface d'administration Django intégrée, et j'ai initialement fait une erreur de syntaxe (une parenthèse non fermée). Cela signifiait que lorsque j'ai touché wsgi.py
et chargé le code (WSGI s'exécutant en mode démon sur mon hôte virtuel), mon site Web était remplacé par une erreur de serveur interne car WSGI s'arrêtait lorsqu'il rencontrait l'erreur de syntaxe.
J'ai donc corrigé l'erreur de syntaxe, vérifié que je n'avais plus avec manage.py check
, et touché wsgi.py
à redéployer. Mais mon site Web affiche toujours une erreur de serveur interne! En vérifiant les journaux Apache, voici ce que je vois:
[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
La première série d'erreurs montre l'échec de WSGI en raison de l'erreur de syntaxe dans my admin.py
. Cependant, la deuxième série d'erreurs semble montrer une erreur interne à Django:
RuntimeError: populate() isn't reentrant
jeté de la populate
méthode de registry.py
.
Googler ce message d'erreur renvoie étonnamment peu d'informations, aucune de celles-ci provenant de la documentation de Django. Apparemment, cela peut parfois arriver si vous nommez une application deux fois dans votre settings.py
, mais je ne le fais pas. Plus important encore, je n'ai pas changé settings.py
depuis le moment où le site Web fonctionnait bien - la seule chose que j'ai changée était admin.py
.
J'ai essayé d'annuler toutes les modifications que j'ai apportées, donc tout mon code Python est de retour dans l'état où il était lorsque le site Web fonctionnait - et j'obtiens toujours l' populate() isn't reentrant
erreur lorsque j'essaye de faire recharger le code par WSGI!
J'ai également essayé de commenter différentes applications dans la section INSTALLED_APPS de settings.py
, et même avec uniquement «django.contrib.staticfiles» activé, l'erreur se produit toujours. Bizarrement, j'obtiens toujours l'erreur même si je commente toutes les applications - Django lève l'erreur même s'il ne charge aucune application!
Quelqu'un sait-il ce qui se passe ici? Ou un meilleur moyen pour moi de déboguer cette erreur, car le traçage dans le journal Apache est plutôt inutile?
Notes: J'utilise Django 1.7, Apache 2.2 et Python 2.7.
la source
wsgi.py
entraîne la même erreur Apache et les fichiers .pyc ne sont pas recréés.Réponses:
Cela est dû à un bogue dans vos paramètres Django quelque part. Malheureusement, Django cache le bogue derrière ce message d'erreur générique et inutile.
Pour révéler le vrai problème, ouvrez
django/apps/registry.py
et autour de la ligne 80, remplacez:avec:
Cela permettra à Django de continuer le chargement et de révéler l'erreur réelle.
J'ai rencontré cette erreur pour plusieurs causes différentes. Une fois, c'était parce que j'avais une mauvaise importation dans l'un des admin.py de mon application.
la source
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
et cela a résolu le problème .L'administrateur de mon serveur a redémarré Apache et cela a résolu ce problème par magie. Les mêmes fichiers Python chargés sans causer
populate() isn't reentrant
. J'ai même essayé de charger un autre fichier avec une erreur de syntaxe, puis de le réparer, et le serveur a pu charger le nouveau fichier et fonctionner correctement sans problème.Je ne sais toujours pas ce qui n'allait pas, mais je marque cela comme une réponse puisque le problème a disparu. (Eh bien, je le marquerai comme étant répondu dès que StackOverflow me permettra d'accepter ma propre réponse.)
Mise à jour : après avoir continué à obtenir cette erreur lorsque je télécharge accidentellement Python avec des erreurs de syntaxe, j'ai trouvé une solution de contournement plus facile que de redémarrer Apache. Lorsque WSGI commence à lancer l'
populate() isn't reentrant
erreur, je remplace mon projet Djangowsgi.py
par cette fonction simple:Ensuite, je recharge mon site Web et le processus du démon WSGI redémarre (ce que je peux dire en regardant le journal Apache, même si le site Web affiche toujours la même erreur 500).
Si je
wsgi.py
reviens ensuite à la normale et que je recharge à nouveau, WSGI récupère avec succès mon code sans lancerpopulate() isn't reentrant
(en supposant que je n'ai aucune erreur de syntaxe cette fois). Donc, l'intégralité d'Apache n'a pas besoin de redémarrer, juste le processus WSGI, et je peux le faire sans privilèges root.la source
startup-timeout
option pour le mode démon de mod_wsgi dans les versions plus récentes de mod_wsgi qui aide à récupérer des erreurs transitoires lorsque Django est en cours d'initialisation, comme une base de données non disponible. Le délai d'expiration entraînera le redémarrage automatique du processus si l'application WSGI ne se charge pas correctement après le délai d'expiration. Même cela n'aidera pas lorsque vous avez un problème permanent avec votre propre code. Dans ce cas, recherchez la toute première erreur, pas l'populate()
erreur car elle donnera la vraie raison pour laquelle votre code échoue.Je sais que c'est une vieille réponse mais je vais contribuer avec ma solution:
Pour diagnostiquer la source du problème, exécutez
manage.py check
et voyez si vous y trouvez quelque choseDans mon cas, une exigence obsolète était le problème et django ne parvenait pas à importer un sous-module
Assurez-vous que vos exigences sont à jour
la source
manage.py check
j'ai trouvé le problème. Je vous remercie.Ce n'est pas une réponse mais une réflexion.
Lorsque vous mettez à niveau vers django 1.7 et que vous avez une erreur 500 et que vous rechargez votre page, Apache dit "populate () n'est pas réentrant". Je pense que c'est lorsque vous chargez votre page, Apache charge tous les modules dont vous avez besoin pour votre application et lorsque l'erreur est gérée, il ne décharge pas le module. Ainsi, lorsque vous rechargez votre page, apache charge à nouveau ces modules mais il est déjà chargé. Donc, apache dit que "populate () n'est pas réentrant".
J'ai deux actions pour corriger cela: Redémarrez apache ou corrigez l'erreur qui gère la première erreur 5OO.
Essayez de redémarrer Apache avec:
J'espère que cela vous aidera.
la source
Si vous obtenez cette erreur lors de l'utilisation de Google App Engine, recherchez dans vos journaux d'autres erreurs qui pourraient en être la cause. Je recevais:
ImproperlyConfigured: Error loading either pysqlite2 or sqlite3 modules (tried in that order): No module named _sqlite3
Vous ne pouvez pas utiliser SQLite avec Google App Engine, alors commentez la
DATABASES
section de l'settings.py
arrêt de cette erreur et de l'RuntimeError("populate() isn't reentrant")
erreur également.la source
Vous pourrez peut-être résoudre ce problème sans redémarrer Apache en touchant un fichier (autre que wsgi.py) qui se trouve au début du processus de chargement. Par exemple, votre fichier de paramètres:
Je n'ai pas correctement résolu cela non plus, mais plus d'informations dans ma question ici: La surveillance des changements de code fonctionne mal avec Django 1.7 sur mod-wsgi
la source
Apache stocke le fichier wsgi dans son cache. Désactiver la mise en cache Apache des fichiers python
Supprimez donc d'abord le fichier wsgi et redémarrez votre acpache, puis ajoutez à nouveau le fichier wsgi et redémarrez l'apache.
la source
J'ai juste rencontré le même problème alors j'ai commencé à regarder autour de moi.
Maintenant je l'ai fait fonctionner, alors j'ai pensé que je devrais le partager avec vous les gars!
Je ne ai fait faire
chown user:group /to/path -R
etchmod 770 /to/path -R
tout recommencer et cela a fonctionné.la source
Cela ressemble à une belle collection de réponses valides pour la même erreur Apache mod-wsgi, chaque gars publiant celle qui fonctionne pour lui / elle, alors voici la mienne:
N'oubliez pas de mettre à jour les exigences de votre projet après le déploiement :)
la source
J'ai rencontré le même problème et la source de l'erreur pour moi était simplement une erreur de syntaxe dans un fichier avec lequel je travaillais. Après avoir corrigé la faute de frappe, l'
populate() is not reentrant
erreur a disparu.Si vous exécutez django à partir d'un script wsgi, vous pourrez peut-être identifier la faute de frappe en exécutant simplement le script wsgi à partir de la ligne de commande. Par exemple:
la source
Cette erreur a également généré si l'utilisation incohérente de l'espace et de la tabulation dans le code.
la source
Configuration: Ubuntu 14.04, Django 1.10, Python 3.5 (in
virtualenv
).J'ai essayé plusieurs de ces solutions sans chance, mais j'ai remarqué que le journal des erreurs Apache contient deux erreurs différentes dans mon cas. Un qui se produit lorsque quelqu'un essaie de visiter une page, un autre qui se produit au démarrage. J'ai manqué celui de démarrage car j'essayais généralement de rafraîchir la page plusieurs fois et je ne voyais donc l'erreur de visite répétée que quelques fois.
J'ai ensuite recherché des solutions à l'erreur de démarrage et la solution à cette question a fonctionné pour moi . En bref, il s'agit de mettre à jour le
mod_wsgi
package de manière détournée.Je recevais des avertissements depuis des mois sur l'incohérence des
mod_wsgi
versions, mais tout à coup, cela a entraîné des erreurs Apache 500. Cela n'a aucun sens pour moi.Je suppose que cette
RuntimeError: populate() isn't reentrant
erreur est généralement le signe qu'il faut rechercher une erreur de démarrage, ce qui indique le vrai problème.en visite
Commencez
la source
populate()
problème et qu'il me semble être un problème entièrement différent, donc je ne vois pas comment vous pensez qu'il résolvait le même problème. Donc, pour autant que quiconque puisse le dire, vous aviez un problème différent pour lequel vous auriez dû poser une question distincte au début plutôt que de confondre les réponses ici pour ce qui ressemble à un problème différent basé sur les détails de cet autre article.Je sais que cela fait un moment que cette question a été posée, mais je viens de rencontrer ce problème en raison d'un problème dont je n'ai pas vu discuter ici. J'obtenais l'
RuntimeError: populate() isn't reentrant
erreur due à SELinux sur CentOS 7. J'ai fait servir Django à partir d'un répertoire personnel, et j'ai simplement dû activer le booléen SELinux qui permettait de lire les répertoires personnels, car l'erreur populate () était due à un problème d'autorisations. La solution pour moi étaitsetsebool -P httpd_read_user_content 1
. J'espère que cela aide quelqu'un ayant ce problème.la source
chcon
pour modifier le contexte du.so
fichier de problème enhttpd_sys_script_exec_t
.La multitude de réponses le rend clair; il s'agit d'une erreur générique qui peut avoir plusieurs causes profondes, généralement liées au chargement d'Apache / WSGI.
Toutes ces réponses sur cette page devraient fonctionner comme une sorte de liste de contrôle, et dans cette veine, je veux ajouter la cause racine de mon instance de cette erreur: échec de l'ajout d'un 'import os' à votre fichier settings.py.
Plus précisément, nous avions un développeur dans notre équipe qui avait l'intention de supprimer un package inutile, et a plutôt supprimé «import os» du haut du fichier de production settings.py. Après un redémarrage d'Apache, notre application ne redémarrait pas et nous avons reçu l'erreur redoutée «RuntimeError: populate () not reentrant».
Un rapide «python manage.py check» n'a pas révélé le problème, mais un «python settings.py» l'a fait; le package os n'a pas été chargé.
Si vous rencontrez cette erreur, concentrez votre recherche sur la vérification de vos fichiers settings.py et également de votre fichier WSGI.
la source
reentrant
erreur. En mode démon, assurez-vous également d'utiliser l'startup-timeout
option si vous rencontrez ce problème en raison d'erreurs transitoires, plutôt que d'erreurs de codage. Au moins de cette façon, il peut récupérer automatiquement.RuntimeError: populate() isn't reentrant
Peut être n'importe quoi, c'est pourquoi il y a tant de réponses différentes à cette question.
L'astuce consiste à regarder le message d'erreur juste avant le
RuntimeError
. Dans votre cas, il semble y avoir une erreur de syntaxe dans le fichier /extra/www/htmlquotes/quotes_django/quotespage/admin.py à la ligne 15, voir:la source
Remarque sur AWS Elastic Beanstalk: la valeur par défaut
settings.py
écrite par Django-admin inclut une référence à une base de données sqlite locale comme source de données. Cela fonctionnera probablement sur votre système d'exploitation local, mais pas sur AWS EB, et produirapopulate() isn't reentrant
une erreur d'exécution. Pour tester cela, commentez simplement leDATABASES={<...>}
instruction danssettings.py
, déployez et rouvrez l'application.la source
django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).
suivi par leRuntimeError: populate() isn't reentrant
. Extrait de la documentation AWS : "Django 2.2 est incompatible avec la plate-forme Elastic Beanstalk Python 3.6." (au moment de la rédaction)J'ai eu ce problème et je n'ai pas trouvé de réponse jusqu'à ce que je revienne sur mes commits. Apparemment, j'avais ajouté une importation accidentelle, à cause de l'auto-complétion, qui a foiré la configuration.
# found in models.py from msilib.schema import SelfReg
Dans le journal des erreurs Apache: RuntimeError ("populate () n'est pas réentrant")
Cela a bien fonctionné dans mon environnement de développement Windows mais a échoué sur le serveur ubuntu / apache.
la source
J'allais dans cette même erreur après avoir changé l'ordre de ce paramètre:
le remettre dans l'ordre précédent et le redémarrage d'Apache ont résolu le problème.
la source
Dans mon cas, j'avais un
custom renderer class
forDjango Rest Framework
, dans un certain but, je devais remplacer la méthode de la classe de rendu "get_context" (divulgation complète: fairedjango toolbar
nombre de requêtes SQL soit correct)J'ai supprimé cette classe et redéployé. Ça a marché.
la source
Dans mon cas, l'erreur s'est produite car un package pip requis était manquant.
J'ai donc fait un
pip install -r requirements.txt
apache redémarré et les choses ont fonctionné à nouveau.la source
La suppression du répertoire virtualenv, la recréation du virtualenv, puis la réinstallation de toutes les exigences l'ont résolu pour moi.
la source
Ajout de ma raison à la liste. Pour moi, c'était parce que j'avais un service django nommé avec le même répertoire qu'un répertoire de processus. Renommer le processus / dir a résolu le problème.
la source
J'ai eu un récursif
django.setup()
, par exemple j'ai essayé d'écrire un à l'django.setup()
intérieur d'un anapp/models.py
, dans la trace de la pile, django a essayé de le signaler près de:alors oui, assurez-vous de ne pas essayer de configurer django pendant que django est en cours de configuration ...
la source
Le redémarrage du serveur Apache pour moi a résolu le problème. Vous pouvez le faire en utilisant la commande $ sudo service apache2 restart
la source
J'ai eu ce même problème, ce qui a fonctionné pour moi était de commenter les paramètres de base de données par défaut dans / settings.py. J'ai aussi lu que les versions ultérieures de django ne sont pas compatibles avec ebs
la source
Pour moi, l'erreur était un
mysqlclient
package manquant dans le fichier requirements.txt.J'ai d'abord installé le
mysqlclient
package avec:puis j'ai mis à jour le fichier requirements.txt avec:
et cela a résolu mon problème.
la source
Dans mon cas, j'ai eu une importation circulaire, ce qui provoque une erreur qui rompt la méthode populate.
la source
Pour jeter mes 2 centimes d'euro:
J'ai recréé une configuration de travail dans Docker. La nouvelle configuration de Docker a échoué avec
ce qui semble être une erreur générique. Dans mon cas, j'ai oublié que
installe la dernière version (
2.0
) au lieu de la version requise1.11
. Changer ceci enrésolu mon problème.
la source
Je pense que c'est une erreur générique lorsque quelque chose ne va pas
settings.py
. Parfois, je peux trouver le problème par essais et erreurs en supprimant les applications installées une par une. Dans certains cas, ce n'est pas lié aux applications installées. Mais d'après mon expérience, dans tous les cas, c'est un problème dans lesettings.py
fichier.la source
vérifiez si vous avez mentionné deux fois les noms de vos API dans la section des applications installées de settings.py.
Définition de l'application
Définition de l'application
La suppression des entrées en double a résolu mon problème
la source