Django新手部署问题 - ImportError: 无法导入设置'settings

14 投票
2 回答
26480 浏览
提问于 2025-04-15 13:19

这个应用在使用Django自带的服务器时运行得很好,但当我用Apache加上mod_python时,就出现了下面的错误。


  File "/usr/local/lib/python2.6/dist-packages/django/conf/__init__.py", line 75, in __init__
    raise ImportError, "Could not import settings '%s' (Is it on sys.path? Does it have syntax errors?): %s" % (self.SETTINGS_MODULE, e)

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

这里是需要的信息:

1) 项目目录:/root/djangoprojects/mysite

2) /root/djangoprojects/mysite的目录列表:

ls -ltr
total 28
-rw-r--r-- 1 root root  546 Aug  1 08:34 manage.py
-rw-r--r-- 1 root root    0 Aug  1 08:34 __init__.py
-rw-r--r-- 1 root root  136 Aug  1 08:35 __init__.pyc
-rw-r--r-- 1 root root 2773 Aug  1 08:39 settings.py
-rw-r--r-- 1 root root 1660 Aug  1 08:53 settings.pyc
drwxr-xr-x 2 root root 4096 Aug  1 09:04 polls
-rw-r--r-- 1 root root  581 Aug  1 10:06 urls.py
-rw-r--r-- 1 root root  314 Aug  1 10:07 urls.pyc

3) 应用目录:/root/djangoprojects/mysite/polls

4) /root/djangoprojects/mysite/polls的目录列表:

ls -ltr
total 20
-rw-r--r-- 1 root root 514 Aug  1 08:53 tests.py
-rw-r--r-- 1 root root  57 Aug  1 08:53 models.py
-rw-r--r-- 1 root root   0 Aug  1 08:53 __init__.py
-rw-r--r-- 1 root root 128 Aug  1 09:02 views.py
-rw-r--r-- 1 root root 375 Aug  1 09:04 views.pyc
-rw-r--r-- 1 root root 132 Aug  1 09:04 __init__.pyc

5) 在文件系统的任何地方运行import django在Python解释器中都能正常工作。

6) httpd.conf的内容:

<Location "/mysite">
    SetHandler python-program
    PythonHandler django.core.handlers.modpython
    SetEnv DJANGO_SETTINGS_MODULE settings
    PythonOption django.root /mysite
    PythonPath "['/root/djangoprojects/', '/root/djangoprojects/mysite','/root/djangoprojects/mysite/polls', '/var/www'] + sys.path"
    PythonDebug On
</Location>

7) PYTHONPATH变量设置为:

echo $PYTHONPATH
/root/djangoprojects/mysite

8) DJANGO_SETTINGS_MODULE设置为:

echo $DJANGO_SETTINGS_MODULE
mysite.settings

9) sys.path的内容是:

import sys
>>> sys.path
['', '/root/djangoprojects/mysite', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', '/usr/lib/python2.6/dist-packages', '/usr/local/lib/python2.6/dist-packages']

我该如何将设置位置添加到sys.path中,以便在多个会话中都能保持这个设置?

我看过很多人遇到同样问题的帖子,也尝试了很多方法,但我还是搞不清楚该怎么做。

希望能得到一些帮助。

提前感谢你们!

安库尔·古普塔

2 个回答

0

试着改成下面这样:

<Location "/mysite">
    SetHandler python-program
    PythonHandler django.core.handlers.modpython
    SetEnv DJANGO_SETTINGS_MODULE mysite.settings
    PythonOption django.root /mysite
    PythonPath "['/root/djangoprojects', '/var/www'] + sys.path"
    PythonDebug On
</Location>

在PythonPath的条目后面不要加“/”(这可能会出问题,至少在Windows上我遇到过这样的麻烦)。

条目'/root/djangoprojects/mysite'和'/root/djangoprojects/mysite/polls'是不需要的,因为你会用完整的名字来引用你的模块(比如,mysite.settings表示的是mysite包里面的settings模块,这才是正确的访问方式,PythonPath是/root/djangoprojects)。

5

你的Apache配置应该像这样:

<Location "/mysite">
    SetHandler python-program
    PythonHandler django.core.handlers.modpython
    SetEnv DJANGO_SETTINGS_MODULE mysite.settings
    PythonOption django.root /mysite
    PythonPath "['/root/djangoprojects/', '/root/djangoprojects/mysite','/root/djangoprojects/mysite/polls', '/var/www'] + sys.path"
    PythonDebug On
</Location>

注意,唯一的区别就是“mysite.settings”。一旦你修改了配置,别忘了重启Apache(可以用命令apache2ctl restart)。想了解更多信息,可以查看这个链接:http://docs.djangoproject.com/en/dev/howto/deployment/modpython/

撰写回答