Ответ 1
Если вы используете virtualenv, попробуйте добавить home
в django.ini:
home=/path/to/venv/
Проверить его через веб-браузер:
uwsgi --ini django.ini --protocol=http
Я использую uwsgi для моего проекта Django (version = 1.4), но есть ошибка, если я запускаю
uwsgi --ini django.ini
from django.core.wsgi import get_wsgi_application ImportError: No module named django.core.wsgi
но я мог бы импортировать django.core.wsgi следующим образом:
>>> import django.core.wsgi
файл 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 development server, if the WSGI_APPLICATION
# setting points here.
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
Если вы используете virtualenv, попробуйте добавить home
в django.ini:
home=/path/to/venv/
Проверить его через веб-браузер:
uwsgi --ini django.ini --protocol=http
Ошибка ImportError: No module named django.core.wsgi
обычно возникает, когда uwsgi пытается прочитать файл wsgi.py и подходит к строке:
from django.core.wsgi import get_wsgi_application
Он не может найти эти модули, потому что Django не установлен, или если он установлен, он не находится в PYTHONPATH.
Если ваш проект находится в виртуальном пространстве, а Django установлен только в этом виртуальном пространстве, то путь к модулям Django не находится в PYTHONPATH, и, таким образом, Python не может его найти.
Если вам интересно, вы можете вставить следующий код в файл wsgi.py
и посмотреть PYTHONPATH:
import os
print '===== sys.path / PYTHONPATH ====='
for k in sorted(os.environ.keys()):
v = os.environ[k]
print ('%-30s %s' % (k,v[:70]))
Если вы запустите локальную версию uwsgi, установленную в virtualenv, то путь будет установлен правильно, но если вы запустите глобальную версию uwsgi, то обычно не будет установлен PYTHONPATH правильно.
Вы можете указать uWSGI путь к virtualenv, и он будет определять правильный PYTHONPATH. Просто используйте аргумент командной строки --virtualenv
, например:
uwsgi --http :8001 --module wsgi --virtualenv /home/jdoe/myvirtualenv
(Следующие аргументы точно так же, как --virtualenv: --venv, --home, -H)
Как ни странно, если вы не используете аргумент --virtualenv, переменная среды $VIRTUAL_ENV
будет установлена правильно. Проверьте это, вставив в wsgi.py:
print os.environ['VIRTUAL_ENV']
Это напечатает:
/home/jdoe/myvirtualenv
Но PYTHONPATH установлен неправильно и не содержит ничего из virtualenv.
Я не могу объяснить, почему это так.
В моем случае я установил приложение Django и все остальное для Python3, но uwsgi использовал Python2. Просто проверьте журнал во время работы uwsgi, использует ли он Python2 или Python3, и переустановите uwsgi, если он несовместим. Найдите строку, похожую на строку ниже, в журнал запуска 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]
Если вы установили gunicorn на sudo apt-get install gunicorn
и (venv) pip install gunicorn
, используйте sudo apt-get remove gunicorn
и перезапустите свою виртуальную среду. Таким образом, это сработало для меня.
Поскольку вы приняли ответ, который упоминает virtualenv
, кажется, что вы его используете. В этом случае убедитесь, что django
установлен в вашем каталоге virtualenv
(скажем venv
).
Вы можете отдельно установить его из pip
под virtualenv
или вручную создать символическую ссылку (если вы используете Unix-подобную систему) в venv
site-packages
ln -s /usr/path_to_django venv/lib/python2.7/site-packages/django
Я получил эту ошибку, потому что создал виртуальную среду в общей папке виртуального бокса, которая не допускала символических ссылок. Я получил некоторые ошибки, но все, казалось, работало, поэтому я продолжил, пока не получил эту ошибку. Проблема была решена, когда я воссоздал свою виртуальную среду, убедился, что ошибок не было и указал uwsgi на папку.