Django:如何指定设置文件的路径

时间:2013-06-28 12:35:18

标签: django settings

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

my_project
    __init__.py
    manage.py
    my_first_app
    my_second_app
    core

现在“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设置为父目录,但无济于事。

3 个答案:

答案 0 :(得分:2)

__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

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

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

Source

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

from .local import *

中的

__init__.py

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

最后,我确定还有其他问题的解决方案,但这可能是最简单的。

祝你好运

答案 1 :(得分:0)

你在某个地方进口地狱。有这个问题太一次了。找出问题根源的唯一方法可能是禁用所有应用,尝试启动服务器,启用第一个应用,启动服务器,启用下一个应用等。

BTW:不应该从Django 1.4开始使用你的项目布局。 https://docs.djangoproject.com/en/dev/releases/1.4/#updated-default-project-layout-and-manage-py

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

答案 2 :(得分:0)

我认为您需要更改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文件,那么简单地将'settings'更改为'local'就行了。

但是,由于您将它放在不同的目录中,我认为您需要配置设置。请参阅: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'))

希望有所帮助。