2016-09-21 6 views
0

Я развертываю проект django и получаю эту ошибку 500 (см. Ошибка журнала сервера).Целевой скрипт WSGI '../wsgi.py' не может быть загружен как модуль Python

Где я делаю неправильно?

некоторые примечания:

  • CentOS
  • mod_wsgi установлен
  • же питон (2.7) и Джанго (1.9.6) версии и в разработке и развертывании environement
  • с использованием virtualenv в развертывания environement

Ошибка журнала сервера

[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93] SyntaxError: invalid syntax 
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93] mod_wsgi (pid=6570): Target WSGI script '/new_esmart/esmart2/esmart2/wsgi.py' cannot be loaded as Python module., referer: http://192.168.30.17/logistics/alarms/ 
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93] mod_wsgi (pid=6570): Exception occurred processing WSGI script '/new_esmart/esmart2/esmart2/wsgi.py'., referer: http://192.168.30.17/logistics/alarms/ 
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93] Traceback (most recent call last):, referer: http://192.168.30.17/logistics/alarms/ 
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93] File "/new_esmart/esmart2/esmart2/wsgi.py", line 13, in <module>, referer: http://192.168.30.17/logistics/alarms/ 
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93]  import django.core.handlers.wsgi, referer: http://192.168.30.17/logistics/alarms/ 
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93] File "/new_esmart/esmart_env/lib/python2.7/site-packages/django/__init__.py", line 1, in <module>, referer: http://192.168.30.17/logistics/alarms/ 
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93]  from django.utils.version import get_version, referer: http://192.168.30.17/logistics/alarms/ 
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93] File "/new_esmart/esmart_env/lib/python2.7/site-packages/django/utils/version.py", line 7, in <module>, referer: http://192.168.30.17/logistics/alarms/ 
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93]  from django.utils.lru_cache import lru_cache, referer: http://192.168.30.17/logistics/alarms/ 
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93] File "/new_esmart/esmart_env/lib/python2.7/site-packages/django/utils/lru_cache.py", line 28, referer: http://192.168.30.17/logistics/alarms/ 
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93]  fasttypes = {int, str, frozenset, type(None)},, referer: http://192.168.30.17/logistics/alarms/ 
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93]      ^, referer: http://192.168.30.17/logistics/alarms/ 
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93] SyntaxError: invalid syntax, referer: http://192.168.30.17/logistics/alarms/ 

wsgi.py

# Add the site-packages of the chosen virtualenv to work with 
site.addsitedir('/new_esmart/esmart_env/lib/python2.7/site-packages') 

# Add the app's directory to the PYTHONPATH 
sys.path.append('/new_esmart/esmart2') 
sys.path.append('/new_esmart/esmart2/esmart2') 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "esmart2.settings") 

# Activate your virtual env 
activate_env = os.path.expanduser("/new_esmart/esmart_env/bin/activate_this.py") 
execfile(activate_env, dict(__file__=activate_env)) 

application = django.core.handlers.wsgi.WSGIHandler() 

httpd.conf

<VirtualHost *:80> 
    ServerAdmin [email protected] 
    DocumentRoot /new_esmart/esmart2 
    ServerName logistica.org 
    ServerAlias www.logistica.org 
    WSGIScriptAlias//new_esmart/esmart2/esmart2/wsgi.py 
    ErrorLog logs/logistica.org-error_log 
    CustomLog logs/logistica.org-access_log common 
</VirtualHost> 

WSGIPythonPath /new_esmart/esmart2:/new_esmart/esmart_env/lib/python2.7/site-packages 

/etc/httpd/conf.d/wsgi.conf

LoadModule wsgi_module modules/mod_wsgi.so 
+0

Хотя вы добавили каталог библиотек 2.7 в путь Python, на самом деле вы не используете версию Python версии 2.7. Здесь много вопросов (большинство из них отвечает автор mod_wsgi), которые рассказывают вам, как указать его на другую версию. –

+0

Не связанный с вашей текущей проблемой, но в новых версиях Django вам нужно [использовать 'get_wsgi_application()'] (https://docs.djangoproject.com/en/1.10/releases/1.7/#wsgi-scripts) вместо ' WSGIHandler() '. – knbk

+0

@ DanielRoseman на моем сервере У меня такая же версия Python (2.7.8) как в env, так и в virtualenv –

ответ

1

Как отметил Даниэль, ошибка указывает, что ваш mod_wsgi скомпилирован для Python 2.6. Чтобы использовать Python 2.7, вам нужно будет установить mod_wsgi с ним, скомпилированным с Python 2.7. Вы не можете попробовать и заставить его использовать Python 2.7, просто обратившись к вашей виртуальной среде Python 2.7, но это не так.

Вы можете проверить, что Python версии mod_wsgi был собран с использованием тестового приложения описаны в:

Вам нужно будет удалить модуль mod_wsgi и установить версию он построил для Python 2.7 , либо из системных пакетов, если они доступны, либо построены из исходного кода, если системные пакеты для mod_wsgi для Python 2.7 отсутствуют.

Я бы также рекомендовал вам проверить документацию Django при использовании mod_wsgi и убедиться, что вы используете режим демон, как он объясняет.

Просто надо знать, что документация Django еще не следует все лучшие практики. Вместо того, чтобы автоматически добавлять site-packages в python-path, вы должны использовать python-home для ссылки на виртуальную среду.См:

1

Вы не используете правильную версию питона, но вы можете указать, какой из них использовать в вашем апача конф с помощью WSGIPythonHome директивы.

Добавить

WSGIPythonHome /path/to/your/virtualenv 

к конфигурации Apache,

Таким образом, вы можете использовать интерпретатор из вашего virtualenv.

EDIT:

Так как вы можете определить питон домой к вашему VirtualHost (WSGIPythonHome не может быть использован в VirtualHost объеме), вы можете использовать WSGIDaemonProcess директивы:

<VirtualHost *:80> 
    ServerName example.com 
    [...] 

    WSGIDaemonProcess example.com python-home=/path/to/venv python-path=<python-path> 
    WSGIProcessGroup example.com 

</VirtualHost> 
+1

Нет, это не совсем правильно. Вы можете указать только на установку Python, которая является той же версией X.Y, а затем она все равно должна быть установкой или виртуальной средой, соответствующей или связанной с конкретной общей библиотекой Python, к которой привязан mod_wsgi. Вы не можете заставить mod_wsgi скомпилировать и связать с Python 2.6, например, использовать установку Python 2.7. –

+0

@GrahamDumpleton Не то, чтобы я сомневаюсь, но я на самом деле проверяю это, я никогда не думал об этом, так как мне никогда не приходилось сталкиваться с этой проблемой. :) – vmonteco