我遇到的问题是我的wsgi文件无法正确导入wsgi处理程序。
/var/log/apache2/error.log报告:
ImportError:没有名为django.core.handlers.wsgi的模块
谷歌搜索出几个结果,主要是处理权限错误,因为www-data无法读取某些文件和/或pythonpath是不正确的。有些解决方案是模糊的,或者只是在我的情况下行不通。
背景资料。
我的/usr/lib目录。
/usr/lib/python2.4
/usr/lib/python2.5
/usr/lib/python2.6
/usr/lib/python-django默认的python版本是2.5.2。如果我以普通用户的身份打开解释器,我可以在没有问题的情况下import django.core.handlers.wsgi。
如果我切换到www-data,python版本是相同的,并且我可以导入django.core.handlers.wsgi模块没有问题。
在bashrc中,我将我的PYTHONPATH设置为包含我所有django站点的主目录.
export PYTHONPATH=/home/meder/django-sites/:$PYTHONPATH所以目录结构是:
django-sites/
testtest是django-admin createproject创建的目录。
我的虚拟主人:
<VirtualHost *:80>
ServerName beta.blah.com
WSGIScriptAlias / /home/meder/django-sites/test/apache/django.wsgi
Alias /media /home/meder/django-sites/test/media/
</VirtualHost>/home/meder/django-sites/test/apache/django.wsgi文件本身:
import os, sys
sys.path.append('/usr/local/django')
sys.path.append('/home/meder/django-sites')
sys.path.append('/home/meder/django-sites/test')
os.environ['DJANGO_SETTINGS_MODULE'] = 'test.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()最后,我的操作系统是Debian和我从后端抓取django 1.1.1。希望这是足够的信息。
更新#1 -根据第一个答复,这是ldd /usr/lib/apache2/modules/mod_wsgi.so的结果
meder@site:/usr/lib/apache2/modules$ ldd mod_wsgi.so
libpython2.5.so.1.0 => /usr/lib/libpython2.5.so.1.0 (0xb7d99000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb7d81000)
libdl.so.2 => /lib/libdl.so.2 (0xb7d7c000)
libutil.so.1 => /lib/libutil.so.1 (0xb7d78000)
libm.so.6 => /lib/libm.so.6 (0xb7d52000)
libc.so.6 => /lib/libc.so.6 (0xb7c14000)
/lib/ld-linux.so.2 (0xb7efd000)因此,它是针对python2.5而不是2.4编译的。
发布于 2010-02-05 15:55:16
由于我使用的是Debian,似乎django在/usr/lib/pymodules/python2.5而不是/usr/lib/python2.5/site-packages中。
我加了
sys.path.append('/usr/lib/pymodules/python2.5') 到了我的wsgi文件的顶部,这就做到了,尽管我觉得我应该以一种更恰当的方式修复这个问题。
发布于 2010-02-05 18:52:12
我不认为你的问题在于sys.path。我一直使用Mod_WSGI与Django一起使用Daemonized,如下所示,
# Note these 2 lines
WSGIDaemonProcess site-1 user=user-1 group=user-1 threads=25
WSGIProcessGroup site-1
Alias /media/ /usr/local/django/mysite/media/
<Directory /usr/local/django/mysite/media>
Order deny,allow
Allow from all
</Directory>
WSGIScriptAlias / /usr/local/django/mysite/apache/django.wsgi
<Directory /usr/local/django/mysite/apache>
Order deny,allow
Allow from all
如果您注意到前2行-您可以指定组和用户将运行此。在您的例子中,您提到www-数据可以导入django模块,但是当Apache部署它时,它不能工作--也许进程是由任何人运行的,或者其他用户/组没有权限导入这个模块。添加DaemonProcess和Group行可以解决您的问题。
HTH。
1供参考-这是Django Mod_WSGI doc-http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango
发布于 2010-02-05 06:03:33
听起来您的mod_wsgi不是针对Python2.5编译的,而是针对Python2.4或2.6编译的。运行:
ldd mod_wsgi.so在安装它的mod_wsgi.so文件上计算它正在使用的内容。
如果情况不同,则需要从源代码重新编译mod_wsgi,使其使用您想要使用的版本。
https://stackoverflow.com/questions/2205105
复制相似问题