我遇到的问题是我的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/
test
test
是由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 Lenny,我从backports抓住了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)
所以它是针对python 2.5而不是2.4编译的。
答案 0 :(得分:2)
由于我在使用Debian,似乎django位于/usr/lib/pymodules/python2.5
而不是/usr/lib/python2.5/site-packages
。
我添加了
sys.path.append('/usr/lib/pymodules/python2.5')
到我的wsgi文件的顶部并且这样做了,虽然我觉得我应该以更恰当的方式解决这个问题。
答案 1 :(得分:1)
我认为你的问题不在于sys.path。我一直使用Django的Mod_WSGI使用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
如果您注意前两行 - 您可以指定组和将运行此组的用户。在你的情况下,你提到www-data可以导入django模块,但是当它部署它时它不起作用 - 也许这个过程是由没有人或其他一些不是拥有导入此模块的权限。添加DaemonProcess和Group行应该解决您的问题。
HTH。
[1]供参考 - 这是Django Mod_WSGI文档 - http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango
答案 2 :(得分:0)
听起来你mod_wsgi不是针对Python 2.5编译的,而是针对Python 2.4或2.6编译的。运行:
ldd mod_wsgi.so
在mod_wsgi.so文件中安装它以确定它的用途。
如果不同,则需要从源代码重新编译mod_wsgi,以便它使用您要使用的版本。