web-dev-qa-db-fra.com

ImportError: aucun module nommé Django.core.wsgi pour uwsgi

J'utilise uwsgi pour mon projet Django (version = 1.4), mais il y a une erreur si je lance

uwsgi --ini Django.ini
 de Django.core.wsgi import get_wsgi_application 
 ImportError: Aucun module nommé Django.core.wsgi 

mais je pourrais importer Django.core.wsgi comme suit:

>>> import Django.core.wsgi

le fichier Django.ini:

 [uwsgi] 
 chdir =/path/to/my/app 
 module = app.wsgi: application 
 master = True 
 vacuum = Vrai 
 Max-requêtes = 5000 
 Socket = 127.0.0.1: 9000 

wsgi.py

import os

os.environ.setdefault("Django_SETTINGS_MODULE", "app.settings")

# This application object is used by any WSGI server configured to use this
# file. This includes Django's development server, if the WSGI_APPLICATION
# setting points here.
from Django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
20
user1687717

Si vous utilisez virtualenv, essayez d'ajouter home à Django.ini:

home=/path/to/venv/

Pour le tester via un navigateur Web:

uwsgi --ini Django.ini --protocol=http
10
sneawo

L'erreur ImportError: No module named Django.core.wsgi survient généralement lorsque uwsgi essaie de lire le fichier wsgi.py et arrive à la ligne:

from Django.core.wsgi import get_wsgi_application

Il ne peut pas trouver ces modules car Django n'est pas installé, ou s'il est installé, il n'est pas dans PYTHONPATH.

Si votre projet est dans un virtualenv et Django n'est installé que dans ce virtualenv, le chemin vers les modules Django n'est pas dans le PYTHONPATH , et donc Python ne le trouve pas.

Si vous êtes curieux, vous pouvez insérer le code suivant dans le wsgi.py fichier, et voyez le PYTHONPATH:

import os
print '===== sys.path / PYTHONPATH ====='
for k in sorted(os.environ.keys()):
    v = os.environ[k]
    print ('%-30s %s' % (k,v[:70]))

Si vous exécutez une version locale d'uwsgi, installée dans virtualenv, le chemin sera défini correctement, mais si vous exécutez une version globale d'uwsgi, le PYTHONPATH ne sera normalement pas défini correctement.

Vous pouvez indiquer à uWSGI le chemin vers virtualenv, et il trouvera le PYTHONPATH correct. Utilisez simplement le --virtualenv argument de ligne de commande, par exemple:

uwsgi --http :8001 --module wsgi --virtualenv /home/jdoe/myvirtualenv

(Les arguments suivants font exactement la même chose que --virtualenv: --venv, --home, -H)

Étonnamment, la définition de $ VIRTUAL_ENV n'a aucun effet sur PYTHONPATH

Curieusement, si vous n'utilisez pas l'argument --virtualenv, la variable d'environnement $VIRTUAL_ENV sera défini correctement. Testez cela en insérant dans wsgi.py:

print os.environ['VIRTUAL_ENV']

Cela imprimera:

/home/jdoe/myvirtualenv

Mais le PYTHONPATH n'est pas correctement défini, et n'inclut rien de virtualenv.

Je ne peux pas expliquer pourquoi c'est.

18
Mads Skjern

Si vous avez installé gunicorn sur les deux Sudo apt-get install gunicorn et (venv) pip install gunicorn, utilisation Sudo apt-get remove gunicorn et redémarrez votre environnement virtuel. De cette façon, cela a fonctionné pour moi.

15
Göktuğ Aşçı

Dans mon cas, j'ai installé l'application Django et tout le reste pour Python3, mais l'uwsgi utilisait Python2. Il suffit de vérifier le journal lors de l'exécution d'uwsgi pour savoir s'il utilise Python2 ou Python3, et de réinstaller uwsgi si il n'est pas cohérent. Recherchez la ligne similaire à la ligne ci-dessous dans le journal de démarrage d'uwsgi.

Python version: 3.4.3 (default, Oct 14 2015, 20:31:36) [GCC 4.8.4] VS Python version: 2.7.6 (default, Jun 22 2015, 18:01:27) [GCC 4.8.2]

2
Abhishek

J'ai reçu cette erreur car j'ai créé l'environnement virtuel dans un dossier partagé de virtualbox qui n'autorisait pas les liens symboliques. J'ai reçu quelques erreurs mais tout semblait fonctionner, alors j'ai continué jusqu'à ce que j'obtienne cette erreur. Le problème a été résolu lorsque j'ai recréé mon environnement virtuel, vérifié qu'il n'y avait aucune erreur et pointé uwsgi vers le dossier.

0
Nick Kanavati

Puisque vous avez accepté la réponse qui mentionne virtualenv, il semble que vous l'utilisiez. Dans ce cas, assurez-vous que Django est installé dans votre répertoire virtualenv (par exemple venv).

Vous pouvez l'installer séparément depuis pip sous virtualenv ou créer manuellement un lien symbolique (si vous êtes sur un système de type Unix) vers les packages de site de venv

ln -s /usr/path_to_Django venv/lib/python2.7/site-packages/Django
0
Yaroslav Nikitenko