0

我使用base.pylocal.pyprod.py和遵循 Django 设置最佳实践staging.py

我的难题是是否可以接受代码重复。让我们举这个例子。我需要设置一个在大型固定值字典中使用的 URL 来配置包。

local.py CONF_URL = 'hard coded local value'

prod.py CONF_URL = os.environ['CONF_URL']

staging.py CONF_URL = 'some other hard coded value'

然后我有类似的代码

PACKAGE_CONF = {
  'CONF_URL': CONF_URL,
  'foo1': bar,
  'foo2': bar,
  'foo3': bar,
  'foo4': bar,
  'foo5': bar,
}
  • 我不能输入PACKAGE_CONFbase.py因为我们base是从叶子设置文件中导入的,而不是相反。
  • 我可以写一些东西来发布过程PACKAGE_CONF,比如使用 env 文件,但这似乎不必要地复杂。
  • 我可以强制用户CONF_URL从环境中获取,但这不是一个好的本地开发体验。
  • 最后我可以复制PACKAGE_CONF,local和.staging,prod

我对这些选项中的任何一个都不满意。有编写精美设置文件经验的人可以提供更好的解决方案吗?

4

2 回答 2

0

我最终做的解决方案是这个

base.py我放

PACKAGE_CONF = {
  'foo1': bar,
  'foo2': bar,
  'foo3': bar,
  'foo4': bar,
  'foo5': bar,
}

然后我PACKAGE_CONF['CONF_URL']在叶子设置文件中覆盖,例如在 staging.py

CONF_URL = 'some other hard coded value'
PACKAGE_CONF['CONF_URL'] = CONF_URL

缺点是您可能会在创建新的叶设置文件时忘记添加此值,这可能会导致意外行为,因为字典存在但缺少一个键。

但是,我认为这是可以接受的,因为当您创建新的叶子设置时,您通常会复制粘贴现有的设置。

于 2019-11-14T19:55:44.287 回答
0

您可以使用.env文件来设置本地/开发环境的变量,并确保您在 staging/prod 环境中设置了相同的变量。

.env文件值仅在环境变量不存在时使用。因此,您可以将.env文件推送到您的代码仓库。

这样,您将能够在base.py文件中只编写一次您的 var。

于 2019-11-14T00:04:00.730 回答