Django管理.py设置默认值

15
我有一个 settings.py 文件和一个 dev_settings.py 文件,用于覆盖开发过程中的一些值。每次我运行 ./manage.py 命令时,都需要指定 --settings=whatever.local_settings。这样做变得非常繁琐,我正在尝试找到一种方法来强制 manage.py 默认加载我的 dev_settings.py 文件,以便我在运行命令时不必每次都输入那么长的参数。
我已经尝试设置 DJANGO_SETTINGS_MODULE,但是似乎 manage.py 会覆盖此选项。
是否有可能实现这一点,还是我注定要始终指定那个参数?
5个回答

17

manage.py会为您设置路径到设置文件,这就是为什么它会忽略DJANGO_SETTINGS_MODULE(它基本上只是一个围绕django-admin.py的脚本)。

有两种简单的方法可以解决这个问题:

  1. 设置DJANGO_SETTINGS_MODULE并使用django-admin.py运行所有命令,而不是使用manage.py。如果您使用vitualenv,那么更好。

  2. 复制manage.py并将其命名为local.py(在我的情况下是这个名称),并将所有settings更名为dev_settings

例如:

#!/usr/bin/env python
from django.core.management import execute_manager
import imp

try:
    import settings_local
except ImportError:
    import sys
    sys.stderr.write("Error: Can't find the file 'settings_local.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)

if __name__ == "__main__":
    execute_manager(settings_local)

现在你可以通过./local.py运行所有命令。

1
我选择了django-admin.py这条路线!我甚至没有意识到你可以这样做。由于某种原因,我认为django-admin.py只是用于创建新项目。我真傻... - intargc

3
这通常是这样完成的:你会有一个 settings.py 文件,其中包含在所有环境中都通用的设置(例如 INSTALLED_APPS 等)。然后,你会有类似于 settings_local.py 的东西,它定义了特定环境中的设置。然后在 settings.py 中导入 settings_local.py
# settings.py

from settings_local import *

settings.py 被添加到您的源代码存储库中,但settings_local.py没有被添加。(但是,您通常会将诸如settings_local.py.example之类的文件添加到存储库中。)

例如,当您首次将应用程序迁移到生产环境时,您需要从您的存储库中获取代码库。然后将 settings_local.py.example 复制到 settings_local.py 并进行任何必要的特定于环境的更改。

然后在每个环境中都有单独的settings_local.py文件,并且它们都可以正常工作。


2
我认为@intargc正在尝试不同的技术(http://toastdriven.com/blog/2010/jan/05/better-local-settings/)。这种方式实际上更容易扩展设置。 - Ondrej Slinták
他的抱怨是这种方法的缺点。我不一定不同意这种方法的逻辑,但这主要是语义,其成本是必须经常指定要使用的设置文件。所有事情都相等的话,简单就是更好的,所以我认为传统的在最后导入本地设置的方法是更好的选择。 - Chris Pratt
1
我不确定它是否真的相等。当我尝试使用这种技术来扩展(而不是覆盖)变量时,它就无法正常工作。虽然那是一段时间之前的事情了。自那以后,我使用第二种方法,并且对我来说效果很好(通过创建新的manage.py文件来简化它,如我的答案所述)。 - Ondrej Slinták
很奇怪,我们以前是这样做的,而且效果非常好。然而,我们与Jacob Kaplan-Moss进行了一次培训,他建议出于几个原因避免采用这种方式。所以我们都决定听从他的建议,采取我们现在正在做的路线。 - intargc
好吧,我猜我不能和Jacob争论;),但是按照典型的方式,Django开发人员强制执行了最佳实践,并没有真正使其易于遵循。在我看来,如果应该遵循这种做法,核心团队应该以支持它为前提,而不是要求人们像修改manage.py一样去做一些事情。 - Chris Pratt
我非常同意你的观点。个人认为这是一个糟糕的想法,但他的理由说服了我的团队中其他开发人员采用这种方式,所以现在我被困在这里了。问题是当我们按照你建议的方式进行时,它完全可以正常工作! - intargc

2

您可以通过将以下行添加到您的.bash_profile文件中来创建bash别名:

mymanage()
{
python manage.py $1 --settings=settings_debug
}
alias mng=mymanage

当您运行以下命令时:

mng runserver

将使用settings_debug.py文件进行设置。


1
你可以使用那个环境变量和django-admin.py一起使用。命令是可以互换的,只有django-admin.py不会覆盖你正在尝试使用的变量。

1
如果一个设置文件适用于所有安装,则可以直接导入它,例如:
from settings_local import *

但通常情况下,settings_local 根据每个安装进行更改和调整,而且由于我的安装脚本直接将文件复制到目标站点(不用担心哪些是本地的,哪些不是),这意味着 settings_local 可能会被覆盖,在避免这种情况的情况下,我只需将 settings_local 保留在安装目标的父文件夹中,并在 settings.py 中手动导入即可。

local_settings_file = os.path.join(prevFolder, "settings_local.py")
if os.path.exists(local_settings_file):
    execfile(local_settings_file)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接