Django / Apache / mod_wsgi: Brak modułu o nazwie importlib

Po pracy z serwerem dev w django przez ostatnie dwa miesiące, nadszedł czas, aby przejść do apache + mod_wsgi.

Problem polega na tym, że kiedy idę do mojej strony (nazwijmy ją junux), do adresu URL odwzorowanego w aplikacji django, rzeczy nie działają. Podczas uruchamiania serwera dev na serwerze wszystko działa poprawnie.

Podsumowując błąd, podałem go w apache error_log:

ImportError: Nie można zaimportować ustawień „junux_site.settings” (czy to na sys.path?): Brak modułu o nazwie importlib

Zdaję sobie sprawę, że jest to podobne do wielu innych pytań w tej sprawie (jest ich tak wiele, że nawet ich nie przytoczę), ale wciąż nie znalazłem odpowiedzi. Przeczytałem kilka przewodników na temat przejścia do produkcji, w tym dokumenty dotyczące wdrażania django, przewodniki mod_wsgi, niektóre prezentacje pycon i cały dzień szukam hasła ...

Wiele zabawnych i ekscytujących szczegółów poniżej.

Każda pomoc zostanie doceniona. Z góry dziękuję.

Konfiguracja:

Apache 2.2.15 z mod_wsgi w CentOS 6Python 2.7.3 skompilowany ze źródłaStrona korzysta z virtualenv

To jest strona błędu, którą zwraca 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

Apacheerror_log ujawnia następujące informacje:

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

Istotnywsgi.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()

Ihttpd.conf: (więcej rzeczy tutaj z domyślnego pliku konfiguracyjnego Apache)

<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

JestWSGIScriptAlias do/test aby sprawdzić, czy mod_wsgi rzeczywiście działa. To robi. Podczas otwierania tego adresu URL (bardzo prosta) aplikacja działa (typowy hello world).

Mam ustawione uprawnienia dochmod o+r na moim pliku wsgi ichmod o+rx na całości/var/www/junux_dev reż, zgodnie z instrukcją zawartą w prezentacji pycon-sydney-2010, od której pochodzitutaj.

questionAnswers(1)

yourAnswerToTheQuestion