ImportError:在apache上安装django mod_wsgi config时没有名为django.core.handlers.wsgi的模块

时间:2010-08-27 13:41:08

标签: django apache configuration install mod-wsgi

我尝试安装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配置

10 个答案:

答案 0 :(得分:16)

我通过添加site-packages的位置解决了这个问题,我将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

答案 1 :(得分:4)

为什么你甚至试图将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 :(得分:3)

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

答案 3 :(得分:3)

错:

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。

答案 4 :(得分:2)

我通过将包含我的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()

答案 5 :(得分:1)

检查您的网站包文件权限。 在我修复文件权限之前,上述解决方案都不适合我。 这是我的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 * (这可能有点矫枉过正,但它对我有用。)

我作为httpd作为apache.user运行,并以root身份运行python,可以看到包很好,但我的权限设置不正确(每个人都读),这就是为什么httpd无法读取包

答案 6 :(得分:0)

这一行肯定是错的:

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

使用/安装mod_wsgi所针对的Python版本安装Django。

答案 7 :(得分:0)

我知道这是一个有点老问题,但我想我会为未来可能会发现这个问题的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 - &gt; mod_wsgi.so-2.6并将其更改为mod_wsgi.so - &gt; mod_wsgi.so-2.7。

很容易。

答案 8 :(得分:0)

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

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

..并将其重新安装在您正在使用的当前python的'site-packages'文件夹中:

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

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

答案 9 :(得分:0)

您好!

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

/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

P.S。抱歉我的英文不好