【问题标题】:Avoiding code duplication in django settings files避免 django 设置文件中的代码重复
【发布时间】:2020-03-09 20:30:57
【问题描述】:

我正在使用 base.pylocal.pyprod.pystaging.py 来遵循 Django 设置最佳实践。

我的难题是是否可以接受代码重复。让我们举这个例子。我需要设置一个在大型固定值字典中使用的 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_CONF 放入base.py,因为我们从叶设置文件导入base,而不是相反。
  • 我可以写一些东西来发布进程PACKAGE_CONF,比如使用 env 文件,但这似乎不必要地复杂。
  • 我可以强制用户从环境中获取CONF_URL,但这不是一个好的本地开发体验。
  • 最后,我可以在localstaging,prod 中复制PACKAGE_CONF

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

【问题讨论】:

    标签: python django settings django-settings 12factor


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      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
      

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

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

      【讨论】:

        猜你喜欢
        • 2018-07-07
        • 2014-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多