我刚刚使用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计算机上,我试图使用pip的Django版本。
问题是我不确定如何解决该问题。天真地将manage.py移到项目文件夹上方的目录不起作用,因为此“ debian软件包版本” manage.py尝试仅使用
import 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 ..下工作?
最佳答案
我不确定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文件的路径。