ImportError: No module named django.core.handlers.wsgi in install django mod_wsgi config on apache

Posted

技术标签:

【中文标题】ImportError: 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。德普。 【参考方案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。

以上是关于ImportError: No module named django.core.handlers.wsgi in install django mod_wsgi config on apache的主要内容,如果未能解决你的问题,请参考以下文章

ImportError : No module named graphics

python27 ImportError: No module named site

Python中ImportError: No module named request

ImportError: No module named win32api

ImportError: No module named zookeeper 问题解决

ImportError: No module named PIL