Настройка Apache и Python WSGI для использования VirtualEnv

У меня возникли проблемы с тем, чтобы заставить Apache/WSGI использовать мой VirtualEnv. Я добавил следующие две строки (путь на сервере указывает на фактическое расположение пакетов сайтов в целевом виртуальном окружении) в мой файл WSGI:

import site
site.addsitedir('/sites/mysite/virtpy/lib/python2.6/site-packages')

(из http://www.foxhop.net/django-virtualenv-apache-mod_wsgi). Однако, когда я пытаюсь загрузить URL-адрес в браузере, я получаю 500. Проверка журналов Apache:

 [Sun Jul 17 11:07:11 2011] [error] [client 94.170.105.142]     app =   import_module(appname)
[Sun Jul 17 11:07:11 2011] [error] [client 94.170.105.142]   File "/usr/local/lib/python2.6/dist-packages/django/utils/importlib.py", line 35, in import_module
[Sun Jul 17 11:07:11 2011] [error] [client 94.170.105.142]     __import__(name)
[Sun Jul 17 11:07:11 2011] [error] [client 94.170.105.142] TemplateSyntaxError: Caught ImportError while rendering: No module named tagging
[Sun Jul 17 11:07:11 2011] [debug] mod_deflate.c(615): [client 94.170.105.142] Zlib: Compressed 629 to 387 : URL /

Итак, я предполагаю, что VirtualEnv не загружается. Кто-нибудь знает, как указать Apache / WSGI правильный виртуальный файл для использования?

ОБНОВИТЬ

Я обновил django.wsgi по совету Кена, но теперь я получаю следующую ошибку в журнале apache

[Sun Jul 17 16:46:36 2011] [info] [client 94.170.105.142] mod_wsgi (pid=11260, process='', application='igniteflow-django.com:8090|'): Loading WSGI script '/sites/igniteflow/apache/django.wsgi'.
[Sun Jul 17 16:46:36 2011] [error] [client 94.170.105.142] mod_wsgi (pid=11260): Target WSGI script '/sites/igniteflow/apache/django.wsgi' cannot be loaded as Python module.
[Sun Jul 17 16:46:36 2011] [error] [client 94.170.105.142] mod_wsgi (pid=11260): Exception occurred processing WSGI script '/sites/igniteflow/apache/django.wsgi'.
[Sun Jul 17 16:46:36 2011] [error] [client 94.170.106.142] Traceback (most recent call last):
[Sun Jul 17 16:46:36 2011] [error] [client 94.170.105.142]   File "/sites/igniteflow/apache/django.wsgi", line 5, in <module>
[Sun Jul 17 16:46:36 2011] [error] [client 94.170.105.142]     execfile(activate_this, dict(__file__=activate_this))
[Sun Jul 17 16:46:36 2011] [error] [client 94.170.105.142] IOError: [Errno 13] Permission denied: '/root/.virtualenvs/igniteflow/bin/activate_this.py'

Я предполагаю, что это связано с тем, что virtualenv находится в корне, а у apache нет разрешений? Я выбрал папку root: www-data, но это не решило проблему. Какие-либо предложения?


person igniteflow    schedule 17.07.2011    source источник
comment
Вы уверены, что библиотека тегов находится в каталоге site-packages вашей виртуальной среды? В зависимости от того, как вы настроили env, некоторые библиотеки устанавливаются из src, а не из папки site-packages.   -  person Craig Blaszczyk    schedule 17.07.2011


Ответы (1)


В моем файле app.wsgi у меня есть что-то вроде этого. Вам нужно будет изменить его, чтобы указать, где находится ваша виртуальная среда, в этом примере моя находится под /opt/ve/ve_name/.

import os
# activate virtualenv
activate_this = os.path.expanduser("/opt/ve/ve_name/bin/activate_this.py")
execfile(activate_this, dict(__file__=activate_this))
person Ken Cochrane    schedule 17.07.2011
comment
IOError: [Errno 13] Отказано в доступе: '/root/.virtualenvs/site1/bin/activate_this.py' Знаете ли вы, как я могу установить virtualenv где-нибудь, где у apache будет доступ? Я попытался создать папку root: www-data, но без изменений. - person igniteflow; 17.07.2011
comment
Похоже, вы используете virtualenvwrapper. Чтобы изменить место установки вашего ve с помощью virtualenvwrapper, вам нужно будет изменить значение WORKON_HOME; экспорт WORKON_HOME=/opt/Envs ; убедитесь, что каталог существует, и вам нужно будет переместить туда ваши текущие envs, если вы не хотите создавать с нуля. В продакшене я не беспокоюсь об использовании virtualenvwrapper, я просто использую виртуалэнв прямо вверх, это позволяет мне размещать свои ве, где я хочу, но требует больше ручной работы. - person Ken Cochrane; 18.07.2011
comment
Спасибо! это заставило его работать. Я установил WORKON_HOME в bashrc как /sites/.virtualenv, воссоздал virtualenv с помощью mkvirtualenv --no-site-packages, и теперь все работает. - person igniteflow; 18.07.2011