mod_wsgi 找不到我的 Python 包?
我的Django应用在Apache/mod_wsgi中加载时,找不到我的外部包,尽管我已经在sys.path中指定了它们?
具体情况如下:
a) 外部包放在 /var/www/site/my/python/config 目录下
b) Django网站(包含settings.py文件)放在 /var/www/site/domain 目录下
c) wsgi配置文件是:
import os, sys
sys.stdout = sys.stderr
# Add the virtual Python environment site-packages directory to the path
import site
site.addsitedir('/var/www/virtualenv/lib/python2.6/site-packages')
# Avoid ``[Errno 13] Permission denied: '/var/www/.python-eggs'`` messages
os.environ['PYTHON_EGG_CACHE'] = '/var/www/egg-cache'
# Add project directory to PYTHONPATH
sys.path.append('/var/www/site') # <---- THIS SHOULD FIND EXTERNAL PACKAGES?
os.environ['DJANGO_SETTINGS_MODULE'] = 'domain.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
d) settings.py文件的开头是这样的:
print "prior to import"
from my.python.config import ConfigParser # <---- THIS EXIST AS INDICATED IN a), but fails!
print after to import"
DEBUG = True
TEMPLATE_DEBUG = DEBUG
ADMINS = (
# ('Your Name', 'your_email@example.com'),
)
MANAGERS = ADMINS
....
我遇到的错误是:
prior to import
mod_wsgi (pid=3465): Exception occurred processing WSGI script '/var/www/mod_wsgi/django.wsgi'.
Traceback (most recent call last):
File "/var/www/virtualenv/lib/python2.6/site-packages/django/core/handlers/wsgi.py", line 250, in __call__
self.load_middleware()
File "/var/www/virtualenv/lib/python2.6/site-packages/django/core/handlers/base.py", line 39, in load_middleware
for middleware_path in settings.MIDDLEWARE_CLASSES:
File "/var/www/virtualenv/lib/python2.6/site-packages/django/utils/functional.py", line 276, in __getattr__
self._setup()
File "/var/www/virtualenv/lib/python2.6/site-packages/django/conf/__init__.py", line 42, in _setup
self._wrapped = Settings(settings_module)
File "/var/www/virtualenv/lib/python2.6/site-packages/django/conf/__init__.py", line 89, in __init__
raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e))
ImportError: Could not import settings 'domain.settings' (Is it on sys.path?): No module named python.config
你可以看到,settings.py文件在尝试加载时打印了“prior to import”,但在导入“my.python.config.ConfigParser”时失败了。不过,它似乎把它识别成了python.config?
有没有什么线索?
我今天都快抓狂了。不过在Eclipse环境中和直接运行'django-admin.py runserver 80'时,一切都能正常工作,前提是我设置了python路径和Django环境变量。我也确认了python路径在sys.path中。
我已经没有主意了,所以任何帮助都非常感谢!
2 个回答
你在/var/www/site的所有子目录及其子目录里都有__init__.py
文件吗?
当你访问my.python.config时,__init__.py
文件需要在我的目录、python目录和config目录里面。
关于权限的问题,wsgi会以apache用户的身份运行(就是你在wsgi.conf里指定的用户)。要注意这一点。
在settings.py文件的开头添加以下内容:
import my
print my.__file__
确认打印出来的路径是你期待的那个'my'包的路径。
换句话说,可能会因为在不同的位置存在多个'my'包,而导致系统选错了包,这通常是因为sys.path的顺序不对。
另外,确保你去看看:
http://code.google.com/p/modwsgi/wiki/VirtualEnvironments
这篇文章讨论了sys.path的顺序问题。