web-dev-qa-db-fra.com

Django populate () n'est pas réentrant

Je continue à avoir cela lorsque j'essaie de charger mon application Django en production. J'ai essayé toutes les réponses de stackoverflow mais rien ne l'a corrigé. Toute autre idée. (J'utilise Django 1.5.2 et 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
27
ip.

En fin de compte, le problème que j'ai eu est que j'ai essayé de lancer une deuxième application Django et que les éléments suivants n'étaient pas définis dans ma configuration Apache:

WSGIDaemonProcess ...
WSGIProcessGroup ...

Vient d’apprendre que vous pouvez exécuter une seule application Django sans les définir, mais lorsqu’il en crée deux, cela crée un conflit.

5
ip.

Cette erreur RuntimeError s’est produite pour la première fois après la mise à niveau vers Django 1.7 (et est toujours présente avec Django 1.8). Cela est généralement causé par une application Django qui génère une erreur, mais cette erreur est avalée d'une manière ou d'une autre.

Voici une solution de contournement qui fonctionne pour moi. Ajoutez-le à votre fichier wsgi.py et l'erreur real doit être enregistrée:

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)

Voir ce fil sur modwsgi pour plus de détails.

29
Dirk Eschler

Il y aura de nombreuses raisons pour que l'erreur populate() isn't reentrant se produise. Si vous regardez le registry.py dans votre application Django probablement dans ce répertoire
/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")

Comme vous le voyez dans le commentaire, il est indiqué que app_config doit être vierge. Ce qui signifie que si l'une des configurations est incorrecte ou si la bibliothèque requise est manquante, l'erreur sera générée. J'ai eu cette erreur parce que j'ai raté l'installation de SQLite. Même si vous voyez, il n’est pas fait mention des causes possibles dans l’exception. J'ai installé sqlite avec cette commande sur debian 

pip install pysqlite

Cela a résolu mon problème. Mon exception à cause de pysqlite manquant. Votre peut-être qu'il manque un autre paquet requis ou des erreurs dans votre settings.py

3
Harun ERGUL

Divulgation complète - Les erreurs "populate () n'est pas réentrant" peuvent avoir plusieurs causes, et la vérification de toute modification récente de la configuration ou du programme est une très bonne idée.

Cependant, cette erreur peut également se produire lorsque Apache est mis à jour et qu'un module n'est plus valide/est corrompu/nécessite une actualisation. Cela nous est arrivé sur Webfaction après une mise à jour Apache (mais peut survenir sur n'importe quel hôte).

L'utilisation du script de redémarrage d'Apache ne vous aidera PAS, car les modules restent chargés au redémarrage. Selon votre système et si les mods sont mis en cache même lorsque Apache est arrêté, cela peut aider.

Arrêtez complètement Apache. Sur Webfaction, c'est:

~/webapps/<YOUR WEB APP>/Apache2/bin/stop

Attendez quelques secondes, puis ...

~/webapps/<YOUR WEB APP>/Apache2/bin/start

Cela devrait corriger le problème. Si votre système met en cache les mods, vous devrez peut-être vider le cache avant de commencer.

J'espère que cela t'aides!

Voici le lien qu'ils m'ont donné (je sais que l'erreur est différente, mais cela s'est produit pour la même raison, avec l'erreur de remplissage):

https://statusblog.webfaction.com/2018/05/16/regarding-glibc_private-errors-in-your-python-application/

1
MontyThreeCard

Pour ceux qui utilisent AWS Lambda (et éventuellement zappa), cela peut se produire lorsque la taille du code et des dépendances compressés dans un package de déploiement dépasse 250 Mo après décompression.

En règle générale, le fichier Zip ne fait que 50 Mo mais peut décompresser à plus de 250 Mo; vous devrez donc peut-être décompresser manuellement le package de déploiement pour vérifier qu'il n'est pas trop volumineux lorsqu'il est décompressé.

https://docs.aws.Amazon.com/lambda/latest/dg/limits.html

0
python1981

Pour moi, cette erreur a été provoquée, car je n'avais pas correctement divisé mon INSTALLED_APPS pour le local et le product Cela signifie en local que j'utilisais Django-cors-headers et que je n'étais pas en production. Mais j'avais accidentellement quitté Django-cors-headers même si je l'avais retiré de mon requirements.txt de production. Après la suppression de cors-headers des applications installées en production, l’erreur a disparu.

0
J. Hesters