Django / Apache / mod_wsgi: No hay un módulo llamado importlib
Después de trabajar con el servidor dev de django durante los últimos dos meses, finalmente llegó el momento de pasar a apache + mod_wsgi.
El problema es que cuando voy a mi sitio (llamémoslo junux), a la URL asignada a la aplicación django, las cosas no parecen funcionar. Cuando se ejecuta el servidor dev en el servidor, las cosas funcionan correctamente.
La línea inferior del error se me da en el apache error_log:
ImportError: No se pudieron importar las configuraciones 'junux_site.settings' (¿Está en sys.path?): No hay un módulo llamado importlib
Soy consciente de que esto es similar a muchas otras preguntas al respecto (hay tantas que ni siquiera las citaré aquí), pero aún no he encontrado la respuesta. He leído bastantes guías sobre cómo pasar a producción, incluidos los documentos de implementación de django, las guías mod_wsgi, algunas presentaciones de pycon y he estado buscando en Google el problema todo el día ...
Un montón de diversión y detalles emocionantes a continuación.
Cualquier ayuda será apreciada. Gracias por adelantado.
La configuración:
Apache 2.2.15 con mod_wsgi en CentOS 6Python 2.7.3 compilado desde la fuenteEl sitio utiliza un virtualenvEsta es la página de error que devuelve 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
El apacheerror_log
revela la siguiente información:
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
Lo relevantewsgi.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()
Yhttpd.conf
: (más cosas aquí desde el archivo de configuración de apache predeterminado)
<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
Hay unaWSGIScriptAlias
a/test
para proporcionar una prueba de validez que mod_wsgi de hecho funciona. Lo hace. Al abrir esa URL, la aplicación (muy simple) funciona (un típico mundo de saludo).
He establecido permisos parachmod o+r
en mi archivo wsgi ychmod o+rx
en general/var/www/junux_dev
dir, como se indica en la presentación de pycon-sydney-2010 a la que se hace referencia desdeaquí.