Вопрос по apache, deployment, mod-wsgi, virtualenv, django – Django / Apache / mod_wsgi: нет модуля с именем importlib

10

После работы с dev-сервером django в течение последних двух месяцев пришло время перейти к apache + mod_wsgi.

Проблема в том, что, когда я захожу на свой сайт (пусть назовем его junux), на URL, сопоставленный с приложением django, кажется, что вещи не работают. При запуске сервера dev на сервере все работает правильно.

Суть ошибки дана мне в apache error_log:

ImportError: Could not import settings 'junux_site.settings' (Is it on sys.path?): No module named importlib

Я знаю, что это похоже на многие другие вопросы по этому вопросу (их так много, что я даже не процитировал их здесь), но я до сих пор не нашел ответа. Я прочитал немало руководств по переходу на работу, в том числе документы по развертыванию django, руководства по mod_wsgi, некоторую презентацию на pycon и весь день занимался поиском этой проблемы ...

Много веселья и интересных деталей ниже.

Любая помощь будет оценена. Заранее спасибо.

Конфигурация:

Apache 2.2.15 with mod_wsgi on CentOS 6 Python 2.7.3 compiled from source The site uses a 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: (more stuff here from the default apache configuration file)

<VirtualHost *:80>
        ServerName junux.net
        ServerAlias junux.net
        ServerAdmin [email protected]

        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 в/test чтобы обеспечить проверку работоспособности mod_wsgi. Оно делает. При открытии этого URL работает (очень простое) приложение (типичный привет).

Я установил разрешения наchmod o+r в моем файле WSGI иchmod o+rx на весь/var/www/junux_dev dir, как указано в презентации на pycon-sydney-2010, на которую ссылаютсяВот.

Ваш Ответ

1   ответ
15

у вас может быть несколько установок 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

Хорошо поймал! Оказывается, apache был привязан к питону, поставляемому по умолчанию с CentOS 6 (2.6.6), а не к скомпилированному мной (2.7.3). Также я установил mod_wsgi (3.2) изyum, что, вероятно, дало мне версию, которая совместима с пакетом Python по умолчанию, поэтому несовместима с 2.7.3, который я пытался использовать. Выкл, чтобы снова установить python и перекомпилировать mod_wsgi ... Спасибо. scooz

Похожие вопросы