【问题标题】:Django: How to specify path to settings fileDjango:如何指定设置文件的路径
【发布时间】:2013-06-28 12:35:18
【问题描述】:

我知道这个问题已经被问过多次,但我似乎仍然找不到适合我的解决方案。我的 Django 项目文件夹如下所示:

my_project
    __init__.py
    manage.py
    my_first_app
    my_second_app
    core

现在“核心”文件夹如下所示:

__init__.py
some_other_stuff.py
settings
     __init__.py
     prod.py
     dev.py
     local.py -> dev.py

local.py 是一个符号链接,指向正确的设置文件,dev.py 在我的机器上,prod.py 在生产中。

这是我的问题:当我尝试使用 manage.py 时,我收到了一个奇怪的错误 ImproperlyConfigured: The SECRET_KEY setting must not be empty. 当我将设置文件 local.py 的路径作为参数 (--settings=core.settings.local) 传递时,它运行良好。我认为问题在于 Django 不知道在哪里查找设置文件。我怎样才能告诉他(她?)去哪里看?

我已经尝试将路径导出到 env (export DJANGO_SETTINGS_MODULE=core.settings.local) 并将 PYTHONPATH 设置为父目录,但无济于事。

【问题讨论】:

  • 试试这个:from .local import * in __init__.py
  • @Mounir 我只是-我...我无语了。如何?为什么?你是巫师吗?将其发布为答案,解释它为什么有效(如果你知道的话),我会接受它。

标签: django settings


【解决方案1】:

__init__.py 的主要用途是初始化 Python 包。演示这一点的最简单方法是查看标准 Python 模块的结构。

package/
    __init__.py
    file1.py
    file2.py

正如您在上面的结构中所见,在目录中包含 __init__.py 文件向 Python 解释器表明该目录应被视为 Python 包 __init__.py 可以是一个空文件,但它通常用于执行包所需的设置(导入内容、加载内容到路径等)。

在您的__init__.py 中要做的一件常见事情是将选定的类、函数等导入包级别,以便可以方便地从包中导入它们。

在上面的示例中,我们可以说 file.py 具有类文件。因此,在我们的 __init__.py 中没有任何内容,您将使用以下语法导入: from package.file import File

但是,您可以将 File 导入您的 __init__.py 以使其在包级别可用:

# in your __init__.py
from file1 import File
# now import File from package
from package import File

Source

总而言之,当您在包 mypackage 中调用 __init__.py 中的 import 时,就像您将包用作简单的 python 文件一样,这就是我的解决方案所做的:

from .local import * in __init__.py

我以前没有在设置案例中使用过它,但是当我想在 Django 应用程序中细分我的模型时使用它,models.py --> 模型包,./manage syndb 没有发现我声明的模型,我发现这个解决方案是相似的。您可以找到更多详情here

最后一件事,我确信还有其他方法可以解决您的问题,但这可能是最简单的。

祝你好运

【讨论】:

  • 感谢您提供所有详细信息!干杯。
【解决方案2】:

你在某个地方的进口地狱。曾经也遇到过这个问题。找出问题根源的唯一方法可能是禁用所有应用程序,尝试启动服务器,启用第一个应用程序,启动服务器,启用下一个等。

顺便说一句:从 Django 1.4 开始,不应使用您的项目布局。 https://docs.djangoproject.com/en/dev/releases/1.4/#updated-default-project-layout-and-manage-py

我会尝试使用新布局并希望它“正常工作”。

【讨论】:

  • 我们将尝试更改布局(毕竟这是正确的布局)。与此同时,@Mounir 的咒语似乎完成了工作。
【解决方案3】:

我认为您需要更改 manage.py 正在查找的文件的名称。

try:
    imp.find_module('settings') # Assumed to be in the same directory.
except ImportError:
    import sys
    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your    settings module.\n" % __file__)
sys.exit(1)

如果您在同一目录中有 settings.py 文件,只需将“设置”更改为“本地”即可。

但是,由于您将它放在不同的目录中,我认为您需要配置设置。参考这个:https://docs.djangoproject.com/en/dev/topics/settings/#using-settings-without-setting-django-settings-module

from django.conf import settings

settings.configure(DEBUG=True, TEMPLATE_DEBUG=True,
TEMPLATE_DIRS=('/home/web-apps/myapp', '/home/web-apps/base'))

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2021-01-09
    相关资源
    最近更新 更多