Django / Apache / mod_wsgi:没有名为importlib的模块

时间:2012-07-15 14:23:38

标签: django apache deployment mod-wsgi virtualenv

在过去两个月与django的开发服务器合作之后,时间终于转移到了apache + mod_wsgi。

问题是,当我访问我的网站(让我们称之为junux)时,对于映射到django应用程序的URL,事情似乎不起作用。在服务器上运行开发服务器时,事情正常。

错误的底线是在apache error_log中给出的:

  

ImportError:无法导入设置'junux_site.settings'(是否打开   sys.path?):没有名为importlib的模块

我知道这与此事上的许多其他问题类似(有很多我甚至不会在这里引用它们),但我仍然没有找到答案。我已经阅读了很多关于转向生产的指南,包括django的部署文档,mod_wsgi的指南,一些pycon演示文稿,并且一直在谷歌上搜索这个问题......

下面有很多有趣和令人兴奋的细节。

任何帮助将不胜感激。 提前谢谢。


配置:

  • 使用CentOS 6上的mod_wsgi的Apache 2.2.15
  • 从源代码编译的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

apache 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/test来提供mod_wsgi确实有效的健全性检查。确实如此。打开该URL时,(非常简单的)应用程序可以正常工作(典型的hello world)。

我已在我的wsgi文件上设置了chmod o+r的权限,并在整个chmod o+rx目录上设置了/var/www/junux_dev的权限,正如{{3}中提到的pycon-sydney-2010演示文稿中所述}。

1 个答案:

答案 0 :(得分:15)

mod_wsgi针对哪个版本的Python编译?看起来您可能在系统上安装了多个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