Apache с virtualenv и mod wsgi: ImportError: нет модуля с именем 'django'
Я пытаюсь обслуживать небольшой проект django со следующей конфигурацией Apache:
Конфигурация виртуального хоста Apache:
<VirtualHost *>
ServerName servername
[...]
<Directory "/path/to/project/project">
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIDaemonProcess project python-path=/path/to/project:/path/to/Envs/venv/lib/python3.5/site-packages
WSGIScriptAlias / /path/to/project/project/wsgi.py
</VirtualHost>
У меня также есть следующее wsgi.py :
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "example.settings")
application = get_wsgi_application()
У меня нет проблем с обслуживанием статических файлов и медиафайлов.
Я также проверил разрешения и попытался рекурсивно использовать 755, а затем 777 в каталог site-package моего virtualenv. Это не сработало.
Но при попытке добраться до корня моего сайта я получаю следующее :
from django.core.wsgi import get_wsgi_application
ImportError: No module named 'django'
Я предположил, что это была проблема, связанная с Python path, так как django установлен в моем virtualenv. Но я добавил соответствующие пути python в атрибут WSGIDaemonProcess S python-path, поэтому я не понимаю, почему он не работает.
Я также думаю, что я мог бы добавить соответствующий каталог к моему пути Python в моем wsgi.py с помощью модуля site , но я хотел бы понять, почему конфигурация Apache, которую я попробовал, недостаточно хороша. Я что-то пропустил?
3 ответов:
У вас отсутствует директива
WSGIProcessGroupили эквивалентный параметр вWSGIScriptAlias, поэтому ваше приложение фактически не выполняется в той группе процессов демона, где вы установили виртуальную среду.См. использование режима демона mod_wsgi
Я также рекомендую установить для группы приложений значение " %{GLOBAL}", если это единственное приложение, которое вы запускаете в группе процессов daemon.
Таким образом, используйте:
WSGIScriptAlias / /path/to/project/project/wsgi.py \ process-group=project application-group=%{GLOBAL}Также лучше использовать
python-homeдля виртуального окружающая среда.WSGIDaemonProcess project python-path=/path/to/project \ python-home=/path/to/Envs/venvСм.:
Моя репутация не превышает 50, поэтому я не могу комментировать, но я хотел бы поделиться своим открытием.
В WSGIDaemonProcess, если вы используете Python 3.5, вам нужно установить точно так, как говорят @graham-dumpleton, с
python-home=/path/to/Envs/venvЗадается явно.
Однако, если вы используете Python 3.4 (или более старую версию Python, например 2.7, насколько я знаю), вам придется настроить его как
python-path=/path/to/project:/path/to/Envs/venv/lib/python3.4/site-packagesТочно так же, как это сделал Аскер.
Действительно странно.
Для меня проблема заключалась в том, что у меня был установлен mod wsgi для python2. Мне пришлось переустановить его для python3:
sudo apt-get install libapache2-mod-wsgi-py3
Comments