【发布时间】:2012-05-04 08:26:18
【问题描述】:
问题
我对以下多个 Django settings.py 文件的处理是否合理(透明、安全等)?
我的方法
我有一个settings.py 和一个settings_local.py。 settings.py 受版本控制,settings_local.py 不受版本控制。在settings.py 的末尾,它会尝试导入settings_local.py(如果可用)。
我对这种方法的理论是,我可以将默认/安全设置保留在 settings.py 下,然后简单地推送到生产环境进行部署。部署时,settings_local.py 将不存在,并且不使用其仅限本地的设置。但是,当在本地工作时,settings_local.py 存在并使用其仅限本地设置。
settings.py
DEBUG = False
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
)
# other settings...
try:
from settings_local import *
except ImportError:
pass
settings_local.py
from settings import *
DEBUG = True
MIDDLEWARE_CLASSES += (
'debug_toolbar.middleware.DebugToolbarMiddleware',
)
# other settings...
我对这种方法的担忧是它们都导入了另一个。我认为这不符合循环导入的条件,但可以作为在不同情况下考虑合并这些文件的指标。
settings_local.py 导入 settings.py 的原因是我可以在遵守 DRY 原则的同时添加到已定义的变量中,例如向MIDDLEWARE_CLASSES 添加一个新条目,而无需完全重新定义它。
谢谢!
解决方案
最终,我放弃了上述方法。尝试解决这个问题对我来说是一个有趣且内容丰富的过程,但是,我的合并方法有太多缺点。
对于将来发现此问题的人们,最合适的方法可能是wiki page on this topic 中概述的解决方案之一,正如@DrTyrsa 和@Mark Lavin 所指出的那样,谢谢!
【问题讨论】:
-
我通常做的是将本地设置设为
settings.py(不在版本控制中),然后在版本控制中设置settings_base.py(实际上,还有settings_dev.py和@987654340 @ 带有对跟踪有用的非敏感设置;这些从settings_base导入)。这避免了准循环导入,但这意味着在新结帐时,您始终必须记住执行例如echo 'from settings_dev import *' > settings.py. -
您也可以在自己发明之前查看existing approaches。
-
@Dougal 谢谢,我也会考虑这种方法。
-
@DrTyrsa 我已经看过了,谢谢分享。这种方法是那里提出的方法的混合体。我在这里的方法似乎符合我的项目和个人逻辑,但是,我非常愿意接受它不是一个好方法。