python - modulenotfounderror - ImportError: no hay un módulo llamado django.core.wsgi para uwsgi
modulenotfounderror no module named django (6)
Estoy usando uwsgi para mi proyecto Django (versión = 1.4), pero hay un error si ejecuto
uwsgi --ini django.ini
from django.core.wsgi import get_wsgi_application ImportError: No module named django.core.wsgi
pero podría importar django.core.wsgi de la siguiente manera:
>>> import django.core.wsgi
el archivo django.ini:
[uwsgi] chdir=/path/to/my/app module=app.wsgi:application master=True vacuum=True max-requests=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()
El error ImportError: No module named django.core.wsgi
surge cuando uwsgi intenta leer el archivo wsgi.py y llega a la línea:
from django.core.wsgi import get_wsgi_application
No puede encontrar estos módulos porque Django no está instalado o, si está instalado, no está en PYTHONPATH.
Si su proyecto está en un virtualenv y Django solo se instala en este virtualenv, de alguna manera, la ruta a los módulos de Django no está en PYTHONPATH y, por lo tanto, Python no puede encontrarlo.
Si tiene curiosidad, puede insertar el siguiente código en el archivo wsgi.py
y ver el 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 ejecuta una versión local de uwsgi, instalada en virtualenv, entonces la ruta se establecerá correctamente, pero si ejecuta una versión global de uwsgi, normalmente no se configurará PYTHONPATH correctamente.
Puede decirle a uWSGI la ruta al virtualenv, y descubrirá el PYTHONPATH correcto. Simplemente use el argumento de la línea de comandos --virtualenv
, por ejemplo:
uwsgi --http :8001 --module wsgi --virtualenv /home/jdoe/myvirtualenv
(Los siguientes argumentos hacen exactamente lo mismo que --virtualenv: --venv, --home, -H)
Sorprendentemente, la configuración de $ VIRTUAL_ENV no tiene efecto en PYTHONPATH
Por extraño que parezca, si no usa el argumento --virtualenv, la variable de entorno $VIRTUAL_ENV
se configurará correctamente. Prueba esto insertando en wsgi.py:
print os.environ[''VIRTUAL_ENV'']
Esto imprimirá:
/home/jdoe/myvirtualenv
Pero PYTHONPATH no está configurado correctamente y no incluye nada de virtualenv.
No puedo explicar por qué esto es.
En mi caso, instalé la aplicación Django y todo lo demás para Python3, pero el uwsgi estaba usando Python2. Simplemente revise el registro mientras ejecuta uwsgi si está usando Python2 o Python3, y reinstale uwsgi si no es consistente. Busque la línea similar a la línea inferior en el registro de inicio de uwsgi.
Python version: 3.4.3 (default, Oct 14 2015, 20:31:36) [GCC 4.8.4]
Python version: 2.7.6 (default, Jun 22 2015, 18:01:27) [GCC 4.8.2]
VS Python version: 2.7.6 (default, Jun 22 2015, 18:01:27) [GCC 4.8.2]
Recibí este error porque creé el entorno virtual en una carpeta compartida de virtualbox que no permitía enlaces simbólicos. Recibí algunos errores pero todo parecía funcionar, así que continué hasta que obtuve este error. El problema se resolvió cuando volví a crear mi entorno virtual, me aseguré de que no hubiera errores y apunté uwsgi a la carpeta.
Si instaló gunicorn en sudo apt-get install gunicorn
y (venv) pip install gunicorn
, use sudo apt-get remove gunicorn
y reinicie su entorno virtual. De esta manera, funcionó para mí.
Si usa virtualenv, intente agregar home
a django.ini:
home=/path/to/venv/
Para probarlo a través del navegador web:
uwsgi --ini django.ini --protocol=http
Ya que aceptaste la respuesta que menciona virtualenv
, parece que la usas. En este caso, asegúrese de que django
esté instalado en su directorio virtualenv
(por ejemplo, venv
).
Puede instalarlo por separado desde pip
en virtualenv
o crear manualmente un enlace simbólico (si está en un sistema similar a Unix) a los paquetes de sitio de venv
ln -s /usr/path_to_django venv/lib/python2.7/site-packages/django