我尝试安装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配置
答案 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。抱歉我的英文不好