1

我刚刚使用 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.

apt-get install python-django当我django-admin startproject testproject安装Debian 软件包(

+-testproject
  +-manage.py
  +-__init__.py
  +-etc.

注意区别:PIP Django 包似乎将 manage.py 放在作为应用程序的 python 模块之外,而 Debian 包将 manage.py 放在模块中。我认为这是由于两个包属于不同版本的 Django,在它们之间改变了结构,因为这两个包以不同的方式执行此操作没有任何意义。

所以我的问题是我正在尝试开发的项目最初是使用 Debian 打包的版本生成的,而在我的 Windows 机器上,我正在尝试使用来自 pip 的 Django 版本。

问题是我不确定如何解决这个问题。天真地将 manage.py 向上移动一个目录,使其位于项目文件夹之上是行不通的,因为这个“debian-package 版本”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 下工作......?

4

3 回答 3

2

我不确定这是否在更新版本的 django 中发生了变化,但默认设置manage.py只是尝试导入settings.py文件并启动管理器。默认情况下,您应该将项目放在您的 PYTHONPATH 中,或者将 settings.py 放入您的 DJANGO_SETTINGS_MODULE 变量中。

您可以manage.py使用以下代码段将其修改为更智能:

管理.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 文件的路径。

于 2012-05-16T23:32:17.887 回答
1

您可以将以下代码添加到文件manage.py中,如下所示:

from django.conf import settings  
settings.configure()
于 2014-04-29T09:16:33.527 回答
0

这确实是由于 1.3 和 1.4 之间的默认布局不同。通常 Django 1.3 项目将在 1.4 下运行,所以这里发生了一些我不太明白的事情。我已经确定问题与平台无关。

我无法弄清楚确切的问题,但我确实找到了解决办法。那是:

  1. 在 Django 1.4 下创建一个新项目并挖掘它的 manage.py 文件。更改项目名称后,此文件将用作 manage.py。我将其命名为“manage14.py”,以便将原始的 manage.py 留给使用 Django 1.3 的同事。
  2. 将项目所在目录之上的目录添加到全局 PYTHONPATH。这不是一个理想的解决方案,但它允许未经修改的 Django 1.4 manage.py 加载项目,而无需将项目转换为 Django 1.4 的组织。

一旦实用,我计划将项目转换为 Django 1.4 格式,因为无论如何它似乎更好,特别是从避免此类问题的角度来看。不幸的是,我必须等到 Ubuntu 存储库获得 1.4,这样我的同事才能使用 PyPI 在 Windows 上使用相同的版本。

于 2012-05-17T02:10:49.030 回答