【问题标题】:ImportError: No module named django.core.handlers.wsgi in install django mod_wsgi config on apacheImportError: No module named django.core.handlers.wsgi in install django mod_wsgi config on apache
【发布时间】:2011-04-04 19:47:24
【问题描述】:

我尝试安装 django 以使用 apache 和 mod_wsgi,但收到此错误:

ImportError: No module named django.core.handlers.wsgi,

我读到可能是用户错误...

在控制台 (ssh) 上,通过 root 访问,我访问 django.core.handlers.wsgi 没有任何问题,但是当 apache 要求访问它时,它不能

我的 django.wsgi:

import os
import sys

sys.path.append('my/rep/parents/of/my/project')
sys.path.append('/usr/lib/python2.4/site-packages/django')
os.environ['DJANGO_SETTINGS_MODULE'] = 'montest.settings'
os.environ['PYTHON_EGG_CACHE'] = '/tmp'


import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

我的 vhost.conf:

Alias /media/ my/rep/parents/of/my/projet/montest/media/

<Directory my/rep/parents/of/my/projet/montest/media>
    Order deny,allow
    Allow from all
</Directory>

WSGIScriptAlias /montest my/rep/parents/of/my/projet/django.wsgi

<Directory my/rep/parents/of/my/projet>
    Order deny,allow
    Allow from all
</Directory>

编辑:

好的,我的结果是 ldd mod_wsgi.so

linux-gate.so.1 => (0x0013c000) 
libpython2.6.so.1.0 => /usr/lib/libpython2.6.so.1.0 (0x00663000) 
libpthread.so.0 => /lib/libpthread.so.0 (0x00bff000) 
libdl.so.2 => /lib/libdl.so.2 (0x0023b000) 
libutil.so.1 => /lib/libutil.so.1 (0x00420000) 
libm.so.6 => /lib/libm.so.6 (0x00110000) 
libc.so.6 => /lib/libc.so.6 (0x00240000) /lib/ld-linux.so.2 (0x0059f000) 

所以我决定用 test.wsgi 测试我的 mod_wsgi 安装

test.wsgi

def application(environ, start_response): 
    status = '200 OK'
    output = 'Hello world, I am a wsgi app!' 
    response_headers = [('Content-Type', 'text/plain'), ('Content-Length', str(len(output)))] 
    start_response(status, response_headers) 
    return [output]

我的 vhost.conf:

WSGIScriptAlias /test /var/www/vhosts/mydomain.fr/subdomains/django/httpdocs/test.wsgi 
<Directory /var/www/vhosts/mydomain.fr/subdomains/django/httpdocs> 
    Order allow,deny 
    Allow from all 
    Options +ExecCGI 
</Directory> 

它现在可以工作了...接下来我将尝试我的 django.wsgi 配置

【问题讨论】:

  • 您应该在配置中使用绝对路径。你为什么用“我的”开始路径?
  • 导致我提出这个问题的至少部分问题最终是我移动了我的 django 基本安装目录.. Soo.. Yeaaaaaah。德普。

标签: django apache configuration installation mod-wsgi


【解决方案1】:

你好!

如果您使用 Linux(Debian、Ubuntu 等)的 deb-distributive,请编辑该文件

/etc/apache2/modules/wsgi.load

此文件包含更正 wsgi-library 的路径(适用于活动版本的 Python 解释器)。如果你使用Python2.6,请更改字符串

LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so-2.7

LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so-2.6

另外,您可以更改 mod_wsgi 模块的软链接:

cd /usr/lib/apache2/modules
ln -s mod_wsgi.so-2.6 mod_wsgi.so

不要忘记更改 /etc/apache2/modules/wsgi.load 中文件的链接 并重新启动 apache 服务器

service apache2 restart

附:对不起我的英语不好

【讨论】:

    【解决方案2】:

    错误:

    WSGIDaemonProcess www.example.com python-path=~/virtualenvs/virt1/lib/python2.7
    

    对:

    WSGIDaemonProcess www.example.com python-path=/home/user/virtualenvs/virt1/lib/python2.7
    

    我花了太多时间试图弄清楚为什么我的 virtualenv 没有正确加载 django。

    【讨论】:

    • neurosnap 像你一样,我也花了太多时间试图弄清楚为什么我的 virtualenv 没有正确加载 django。这有效....
    【解决方案3】:

    检查您的站点包文件权限。 在我修复文件权限之前,上述解决方案都不适合我。 这是我的 ssl_error_log 文件中的内容:

    mod_wsgi (pid=986, process='OSQA', application='xxxxxx.yyy.com|/forum'): Loading WSGI script '/data/http/osqa/osqa.wsgi'. 
    mod_wsgi (pid=986): Target WSGI script '/data/http/osqa/osqa.wsgi' cannot be loaded as Python module.
    mod_wsgi (pid=986): Exception occurred processing WSGI script '/data/http/osqa/osqa.wsgi'. Traceback (most recent call last):   File "/data/http/osqa/osqa.wsgi", line 14, in <module>
                import django.core.handlers.wsgi  ImportError: No module named django.core.handlers.wsgi
    

    但我在我的服务器上解决了它。如果您可以在命令行上执行此操作,那么此解决方案适合您:

    python
    >>> import django.core.handlers.wsgi
    >>>
    

    有效的是我 chmod go+rx site-packages libpython* (这可能有点矫枉过正,但它对我有用。)

    我以 apache.user 身份运行 httpd,并以 root 身份运行 python,可以正常查看包,但我的权限设置不正确(所有人都可以阅读),这就是 httpd 无法读取包的原因.

    【讨论】:

    • 虽然不是我的确切问题,但这导致了我的问题:我有两个具有不同 virtualenv 路径的 django 应用程序venv vs env,但我重新使用了我的 django.wsgi - 谢谢!!!
    【解决方案4】:

    我通过添加站点包的位置解决了这个问题,我将 django 子目录 (/Library/python/2.7/site-packages) 保存到 WSGIDaemonProcess:

    WSGIDaemonProcess www.example.com processes=2 threads=15 display-name=%{GROUP} 
        python-path=/Library/python/2.7/site-packages
    

    如果您使用嵌入式服务器模式,请使用 httpd.conf:

    WSGIPythonPath /Library/python/2.7/site-packages
    

    【讨论】:

    • 我的路径最终是 /usr/local/lib/python2.7/site-packages
    • 是的,我在 virtualenv 中有这个。这就是为我解决的问题
    【解决方案5】:

    如果你从旧的 python 库中删除 django 会更好。

    [root@lts5srv1]# rm -rf /root/epd-5.1.0/lib/python2.5/site-packages/django
    

    ..并在您正在使用的当前 python 的“站点包”文件夹中重新安装它:

    [root@lts5srv1 Django-1.4.1]# /usr/local/bin/python2.6 setup.py install
    

    这就是我所做的,我不再收到那个错误了!

    【讨论】:

      【解决方案6】:

      我通过将保存我的 django 安装的父目录添加到 wsgi.py 中的 sys.path 解决了这个问题。这是我的设置,FWIW:

      /home/banjer/myproject/wsgi.py

      import os, sys
      sys.path.append('/home/banjer/django')
      sys.path.append('/home/banjer') # this line solved it
      sys.executable = '/usr/local/python-2.7.2/bin/python'
      os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
      
      import django.core.handlers.wsgi
      application = django.core.handlers.wsgi.WSGIHandler()
      

      【讨论】:

        【解决方案7】:

        我知道这是一个有点老的问题,但我想我会为未来可能会发现这个问题的 SO 用户插话:

        您的 mod_wsgi 链接到 python2.6,但您正在使用 python 2.4 根据您的配置运行 django?

        我将假设您的 /usr/bin/python 指向的不是 2.6,这是 mod_wsgi 编译时所针对的。这也可能是由于您正在针对 2.4 运行 django。当 django 使用 python2.7 时,当我加载与 python2.6 链接的 mod_wsgi 时,我收到了同样的错误。使用我安装的 mod_wsgi 版本 - 它同时支持 python2.[6-7],所以我所要做的就是删除 /usr/lib/apache2/modules/ 中 mod_wsgi.so -> mod_wsgi 的符号链接.so-2.6 并将其更改为 mod_wsgi.so -> mod_wsgi.so-2.7。

        很简单。

        【讨论】:

          【解决方案8】:

          您为什么还要尝试将 site-packages 目录添加到 sys.path 中?如果您的 mod_wsgi 是针对 Python 2.4 编译的,那么它应该已经在 site-packages 目录中查找。听起来你的 mod_wsgi 甚至没有针对 Python 2.4 编译。

          运行:

          ldd mod_wsgi.so
          

          根据您安装的 mod_wsgi.so 文件计算出编译的 Python 版本并发布结果。

          【讨论】:

          • 因为他们使用的不是 2.4 而是 2.7。可能是因为他们安装了多个版本
          • 您不能强制为特定 Python 版本编译的 mod_wsgi.so 使用不同的 Python 版本。实际需要的 Python 库实际上嵌入/链接到 mod_wsgi.so。他们说最终工作的配置仍然被破坏。
          • 你是对的。我遇到了同样的问题,然后我意识到即使我创建了一个 virtualenv 我也遇到了错误,原因是 mod_wsgi 是为另一个 python 版本编译的。
          【解决方案9】:

          我之前也遇到过这个问题,这是因为 Apache/mod_wsgi 进程没有读取模块的权限。您可以使您的 site-packages/django 目录对世界可读,或添加其他适当的用户/组权限。

          【讨论】:

          • 需要对我的站点包目录的读取和执行权限。只读对我不起作用。
          • 需要写入权限才能写入已编译的 (.pyc) 文件。 pip 具有 compile 选项以相应地进行预编译。
          【解决方案10】:

          这行肯定是错的:

          sys.path.append('/usr/lib/python2.4/site-packages/django')
          

          使用/用于构建 mod_wsgi 的 Python 版本安装 Django。

          【讨论】:

          • i v 阅读:“可以使用 Python 2.3 以后的 Python 2.X 版本”code.google.com/p/modwsgi/wiki/QuickInstallationGuide
          • 是的......你说我需要为 python2.4 安装 mod_wsgi 如果我在我的 django 中使用 python2.4 吗?正确吗?
          • 或者你需要为 mod_wsgi 适用的任何 Python 版本安装 Django。
          猜你喜欢
          • 1970-01-01
          • 2017-03-03
          • 2011-09-02
          • 1970-01-01
          • 2017-09-05
          • 2014-06-18
          • 1970-01-01
          • 1970-01-01
          • 2012-08-24
          相关资源
          最近更新 更多