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()
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
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)
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.
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.
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]
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.
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