Django / Apache / mod wsgi: нет модуля с именем importlib
после работы с dev-сервером django в течение последних двух месяцев пришло время перейти на apache + mod_wsgi.
проблема в том, когда я иду на свой сайт (назовем его junux), к URL, сопоставленному с приложением django, вещи, похоже, не работают. При запуске dev-сервера на сервере все работает правильно.
нижняя строка ошибки дается мне в Apache error_log:
ImportError: не удается импортировать настройки 'junux_site.настроек (это на системный.путь?): Нет модуля с именем importlib
я знаю, что это похоже на многие другие вопросы по этому вопросу (их так много, что я даже не буду цитировать их здесь), но я все еще не нашел ответа. Я прочитал довольно много руководств по переходу к производству, включая документы о развертывании django, руководства mod_wsgi, некоторые презентации pycon и весь день гуглил проблему...
много веселья и интересных деталей под.
любая помощь будет оценили. Спасибо заранее.
конфигурация:
- Apache 2.2.15 с mod_wsgi на CentOS 6
- Python 2.7.3 скомпилирован из источника
- сайт использует virtualenv
это страница ошибки Apache возвращает:
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Apache/2.2.15 (CentOS) Server at junux.net Port 80
Апач error_log
раскрывает следующую информацию:
mod_wsgi (pid=22502): Create interpreter 'junux.net|/dev'.
mod_wsgi (pid=22502): Exception occurred processing WSGI script '/var/www/junux_dev/junux_site/wsgi.py'.
Traceback (most recent call last):
File "/var/www/junux_dev/venv/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 219, in __call__
self.load_middleware()
File "/var/www/junux_dev/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 39, in load_middleware
for middleware_path in settings.MIDDLEWARE_CLASSES:
File "/var/www/junux_dev/venv/lib/python2.7/site-packages/django/utils/functional.py", line 184, in inner
self._setup()
File "/var/www/junux_dev/venv/lib/python2.7/site-packages/django/conf/__init__.py", line 42, in _setup
self._wrapped = Settings(settings_module)
File "/var/www/junux_dev/venv/lib/python2.7/site-packages/django/conf/__init__.py", line 95, in __init__
raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e))
ImportError: Could not import settings 'junux_site.settings' (Is it on sys.path?): No module named importlib
соответствующие wsgi.py
:
import os
import sys
import site
# use our virtual environment
SITE_DIR = os.path.dirname(__file__)
PROJECT_ROOT = os.path.dirname(SITE_DIR)
site_packages = os.path.join(PROJECT_ROOT, 'venv/lib/python2.7/site-packages')
site.addsitedir(os.path.abspath(site_packages))
sys.path.insert(0, SITE_DIR)
sys.path.insert(1, PROJECT_ROOT)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "junux_site.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
и httpd.conf
:
(больше материала здесь из файла конфигурации apache по умолчанию)
<VirtualHost *:80>
ServerName junux.net
ServerAlias junux.net
ServerAdmin admin@junux.net
WSGIScriptAlias /test /var/www/test/hello.py
WSGIScriptAlias /dev /var/www/junux_dev/junux_site/wsgi.py
<Directory /var/www/test >
Order allow,deny
Allow from all
</Directory>
<Directory /var/www/junux_dev >
Options FollowSymLinks
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
LogLevel info
здесь WSGIScriptAlias
to /test
чтобы обеспечить здравомыслие-проверьте, что mod_wsgi действительно работает. Так и есть. При открытии этого URL-адреса (очень простое) приложение работает (типичный мир hello).
я установил разрешения на chmod o+r
в моем файле wsgi и chmod o+rx
на всю /var/www/junux_dev
dir, как указано в презентации pycon-sydney-2010 от здесь.
1 ответов
против какой версии Python был скомпилирован mod_wsgi? Похоже, у вас может быть несколько установок Python в системе, и ваша виртуальная среда использует Python 2.7, но ваш mod_wsgi скомпилирован против 2.6.
я основываю это предположение на том, что importlib был добавлен только в Python 2.7, поэтому, если mod_wsgi был скомпилирован для 2.6 и использовал эту базовую установку, то не смог бы найти importlib.
выполнить чеки:
http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Python_Shared_Library http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Python_Installation_In_Use