使用WSGI和虚拟环境时Django错误:无法导入设置

2 投票
1 回答
1632 浏览
提问于 2025-04-17 09:46

我看了很多关于wsgi无法找到Django的settings.py文件的问题,最后我得出的结论是,我的Django项目没有在PYTHONPATH中。

事情变得复杂的是,我在系统层面上运行的是一个旧版本的Django,但这个项目需要在一个虚拟环境中运行。

我在/usr/local/pythonenv/election设置了一个虚拟环境,而我的项目位于/usr/local/pythonenv/election/src/dev/election。

我的.wsgi文件在/usr/local/pythonenv/election/src/dev/election/config/目录下。

我可以通过$ python manage.py runserver命令来运行Django服务器。

但是当我使用apache和mod_wsgi时,我遇到了错误:

ImportError: Could not import settings 'election.settings' (Is it on sys.path? Does it have syntax errors?): No module named election.settings

这是我的.wsgi文件:

import os
import sys
import site

sys.stdout = sys.stderr

HERE = env_root = os.path.abspath(os.path.dirname(__file__))
found = False
while env_root != '/':
    env_root = os.path.abspath(os.path.dirname(env_root))
    if os.path.exists(os.path.join(env_root, 'bin', 'activate')):
        found = True
        break
assert found, "didn't find a virtualenv in any parent of %s" % HERE

sitepackages_root = os.path.join(env_root, 'lib')
assert os.path.exists(sitepackages_root), "no such dir %s" % sitepackages_root
for d in os.listdir(sitepackages_root):
    if d.startswith('python'):
        site.addsitedir(os.path.join(sitepackages_root, d, 'site-packages'))
        break
else:
    raise RuntimeError("Could not find any site-packages to add in %r" % env_root)

os.environ['DJANGO_SETTINGS_MODULE'] = 'election.settings'
os.environ['PYTHON_EGG_CACHE'] = '/tmp/election-python-eggs'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

这是错误追踪信息:

[Sat Jan 07 21:54:19 2012] [error] [client 192.168.150.122]   File "/usr/lib/pymodules/python2.6/django/core/handlers/base.py", line 33, in load_middleware
[Sat Jan 07 21:54:19 2012] [error] [client 192.168.150.122]     for middleware_path in settings.MIDDLEWARE_CLASSES:
[Sat Jan 07 21:54:19 2012] [error] [client 192.168.150.122]   File "/usr/lib/pymodules/python2.6/django/utils/functional.py", line 269, in __getattr__
[Sat Jan 07 21:54:19 2012] [error] [client 192.168.150.122]     self._setup()
[Sat Jan 07 21:54:19 2012] [error] [client 192.168.150.122]   File "/usr/lib/pymodules/python2.6/django/conf/__init__.py", line 40, in _setup
[Sat Jan 07 21:54:19 2012] [error] [client 192.168.150.122]     self._wrapped = Settings(settings_module)
[Sat Jan 07 21:54:19 2012] [error] [client 192.168.150.122]   File "/usr/lib/pymodules/python2.6/django/conf/__init__.py", line 75, in __init__
[Sat Jan 07 21:54:19 2012] [error] [client 192.168.150.122]     raise ImportError, "Could not import settings '%s' (Is it on sys.path? Does it have syntax errors?): %s" % (self.SETTINGS_MODULE, e)
[Sat Jan 07 21:54:19 2012] [error] [client 192.168.150.122] ImportError: Could not import settings 'election.settings' (Is it on sys.path? Does it have syntax errors?): No module named election.settings

1 个回答

3

你是在什么地方把'/usr/local/pythonenv/election/src/dev'加到sys.path里的呢?

你的WSGI文件看起来比实际需要的要复杂多了。

确保你去看看这个:

http://code.google.com/p/modwsgi/wiki/WhereToGetHelp?tm=6#Conference_Presentations

还有,记得阅读这个:

http://code.google.com/p/modwsgi/wiki/VirtualEnvironments

并且按照演示中提到的方法使用activate_this来激活虚拟环境。

撰写回答