我刚刚将一个使用Mercurial的Django项目克隆到我已经设置了Python 2.7的Windows机器上。当我尝试运行manage.py
(有或没有命令)时,我收到以下错误:
Traceback (most recent call last):
File "C:\Users\jes.000\Documents\project\manage.py", line 30, in <module>
import django.core.servers.basehttp
File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 26, in <module>
from django.views import static
File "C:\Python27\lib\site-packages\django\views\static.py", line 95, in <module>
template_translatable = ugettext_noop(u"Index of %(directory)s")
File "C:\Python27\lib\site-packages\django\utils\translation\__init__.py", line 75, in gettext_noop
return _trans.gettext_noop(message)
File "C:\Python27\lib\site-packages\django\utils\translation\__init__.py", line 48, in __getattr__
if settings.USE_I18N:
File "C:\Python27\lib\site-packages\django\utils\functional.py", line 184, in inner
self._setup()
File "C:\Python27\lib\site-packages\django\conf\__init__.py", line 40, in _setup
raise ImportError("Settings cannot be imported, because environment variable %s is undefined." %ENVIRONMENT_VARIABLE)
ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.
我知道manage.py应该设置该环境变量。我也明白我可能会收到这个错误,因为项目不在python路径中......但手动添加它似乎不应该是必要的。还没有manage.py也应该解决这个问题吗?
编辑:我刚测试过,发现它在Linux下完全一样。
编辑:这是一个有用的发现:如果我通过PIP 安装Django,我只会收到此错误,如果我在Ubuntu上安装python-django包,它可以正常工作。因此,debian软件包正在做的事情是PIP不是。也许debian包设置了一些环境变量?我需要弄清楚,因为我正试图在Windows上开发。
编辑:我认为我发现了问题,但不是解决方案。在Ubuntu机器上工作,当我通过PIP(pip install django
)安装Django时,这个项目不能解决我给出的错误。如果我创建一个新项目(django-admin startproject testproject
)并尝试它的工作原理,它在创建的文件夹中包含manage.py
,另一个文件夹包含其他所有内容。像这样:
+-testproject
+-manage.py
+-testproject
+-__init__.py
+-etc.
当我安装Debian软件包(apt-get install python-django
)时,我正在尝试处理工作项目,如果我创建了一个测试项目(django-admin startproject testproject
),它有一个像这样的文件夹结构:
+-testproject
+-manage.py
+-__init__.py
+-etc.
注意区别:PIP Django软件包似乎将manage.py放在作为应用程序的python模块之外,而Debian软件包将manage.py放在模块中。我认为这是因为两个软件包是Django的不同版本,在它们之间改变了结构,因为这两个不同的软件包没有任何意义。
所以我的问题是我尝试开发的项目最初是使用Debian打包的版本生成的,而在我的Windows机器上我试图使用Django的版本来自pip。
麻烦的是,我不确定如何解决问题。天真地将manage.py移动到一个目录上,使它在项目文件夹上方不起作用,因为这个debian-package版本&#39; manage.py只尝试import settings
,如果它与settings.py不在同一个文件夹中,则会失败。但是在Django的其他地方,似乎期待项目本身处于//settings.py(如果使用了django-admin的pip版本就是这种情况),而不是在/settings.py(就像是如果使用debian-package版本的情况。)
如果我查一下,Ubuntu存储库中的版本是1.3.1,而PyPI中的版本是1.4。查看1.4的发行说明,嘿:
更新的默认项目布局和manage.py删除了 来自先前版本的“魔力”。对于那些不喜欢新人的人 布局,您可以使用自定义项目和应用程序模板!
但是......使用1.3版本生成的项目仍然不能在1.4 ..?
下工作答案 0 :(得分:2)
我不确定这是否在更新版本的django中有所改变,但默认manage.py
只是尝试导入settings.py
文件并启动管理器。您应该将项目放在PYTHONPATH中,或者默认情况下将settings.py放入DJANGO_SETTINGS_MODULE变量中。
您可以使用此代码段修改manage.py
更聪明一点:
<强> manage.py 强>
#!/usr/bin/env python
from django.core.management import execute_manager
...
import settings
import os
project = os.path.basename(os.path.dirname(__file__))
os.environ['DJANGO_SETTINGS_MODULE'] = '%s.settings' % project
if __name__ == "__main__":
execute_manager(settings)
现在您可以从任何位置运行manage.py,因为它将始终显式设置settings.py文件的路径。
答案 1 :(得分:1)
您可以将以下代码添加到 manage.py 文件中,如下所示:
from django.conf import settings
settings.configure()
答案 2 :(得分:0)
这确实是由于默认布局在1.3和1.4之间的差异。通常Django 1.3项目将在1.4以下工作,所以在这里还有其他一些我无法理解的东西。我已经确定问题不依赖于平台。
我无法弄清楚确切的问题,但我确实找到了解决办法。那是:
一旦实用,我计划将项目转换为Django 1.4格式,因为它似乎更好,特别是从避免这种问题的角度来看。不幸的是,我必须等到Ubuntu repo的1.4才能让我的同事使用PyPI达到我在Windows上的相同版本。