任何Python和Django应用程序的可堆叠设置

stackable的Python项目详细描述


可堆叠配置

Stackable是Django设置的一个替代品settings.py,非常适合12因素应用程序:

  • 特定于环境的配置设置
  • 模块化配置设置
  • 面向对象的子类化
  • 配置设置可堆叠
  • 秘密数据处理(密钥、密码)

使用这种方法可以让我们从传统的Djangosettings中获得一些好处, 尤其是复杂性变得易于管理。在

工作原理

StackableSettings使用Python标准类和多重继承来组合设置。示例:

# config.py
EnvSettings_GLOBAL(object):
  # standard apps
  INSTALLED_APPS=(
     ...
  )
  SOME_SETTING='foo'

Config_SomeApp(object):
  APP_CONFIG='baz'

EnvSettings_Local(EnvSettings_GLOBAL):
  # additional settings for local testing
  SOME_SETTING='bar'
  APP_CONFIG='testing'

# load order is in reverse, that is first EnvSettings_GLOBAL,
# then Config_SomeApp. In other words, Config_SomeApp overrides
# any variable set by EnvSettings_GLOBAL.
EnvSettings_production(Config_SomeApp,
                      EnvSettings_GLOBAL):
  SOME_SETTING='prod'

# settings.py
StackableSettings.load()

跑步管理.py将加载配置.py(或配置模块)并导入 设置类。通过加载类及其所有 超类,将类中所有大写的变量应用到 设置.py的local()作用域,这与使用大写变量相同 在设置.py直接。请注意,只加载大写的变量。在

要加载的设置类由DJANGO_CONFIGURATION env变量给定, 默认为EnvSettings_Local。你可以在 应用程序/配置模块。在./deploy/common中有几个配置 可跨可部署应用程序使用的类。在

在上面的例子中,如果DJANGO_配置,某些_设置的值将为'bar' 未设置或具有值“EnvSettings_local”。它会有价值的 “prod”,如果DJANGO_配置设置为“EnvSettings_production”。在

补丁

我们加载设置的方法是遍历类中的类列表 在$DJANGO_配置中指定。所以你有环境设置收集 里面有很多类。设置加载器所做的是全数接收 上面的“大小写”变量并将其添加到设置列表中,其中 设置将被稍后加载的设置覆盖。所以如果你有

^{pr2}$

加载MyEnv后,您将得到FOO_nubaz==tuple('abc')。有点像 FOOéu BAZ+='abc'不会工作,因为它只会取代以前的东西。在

这就是为什么我们需要使用patch

class MyEnv(SomeOther)
  _addtl_foo_baz = ('abc',)
  __patches__ = StackableSettings.patch(
      StackableSettings.patch_list('FOO_BAZ', _addtl_foo_baz),
  )

结果FOO_nubaz==tuple('xyz','abc')。有几种修补方法, 请参见StackableSettings。在

密钥处理

为了不向团队中的每个人公开生产密钥,StackableSettings 使用环境变量或文件实现简单的密钥链。用这种方法, settings类只包含占位符值,这些值将被替换 在运行时由真正的密钥和秘密。将检索要应用的密钥 根据DJANGO_CONFIGURATIONenv变量,使每个环境都可以 使用不同的键。在

密钥存储在加密的环境变量或加密文件中。 默认情况下,源文件位于~/.stackable/keys.yml中,由 环境名称。它们keys.yml文件如下所示:

# yml
EnvSettings_Local:
   SOME_SETTING: SECRET

EnvSettings_Production:
   SOME_SETTING: OTHER_SECRET
...

要创建加密的环境变量:

$ python -m stackable.encryptkeys
Creating variables for stackable from /home/patrick/.stackable/keys.yml
Set the environment for stackable as follows:
---
export DJANGO_CONFIGURATION=EnvSettings_Local DJANGO_CONFIGURATION_TEST=EnvSettings_Local ENV_APIKEY_DECRYPT=ce77e82d-b0a2-4007-9380-d7fddd4bd420 EnvSettings_Local_KEYS=VydQzauHmTnqladba+oU16w=

要在EnvSettings类中启用加密密钥,请执行以下操作:

from stackable.contrib.conf_api import Config_ApiKeys

class EnvSettings_XYZ(Config_ApiKeys, 
                      ...):
    pass

Config_ApiKeys触发器可堆叠从环境中读取加密密钥。 有关可用选项的更多详细信息,请参见其定义。在

托多

  • 为此实现一个Django命令

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
尝试在Java11中加载一个图像只会显示一个空白屏幕   使用PHP解压文件,该文件使用Java Android进行压缩和上载   java嵌入式Jetty和复杂日志记录   java Android传感器在服务中不工作   java如何在鼠标单击的瞬间打开和关闭布尔值?   web服务如果我想运行Java代码,我应该使用什么web服务器?   sockets Java客户端从服务器读取不正确的整数   多线程双重检查锁在这个java代码上不起作用?   java如何解决此通信链路故障?   java如何识别放置位置?   java调试时如何直接在IDE中查看其他对象的私有字段?   数学在JSP/Java中如何从double中获取整数和小数部分?   java重新启动接收两个可能的状态代码之一   java如何使本机查询忽略筛选器的空白值?   java无法通过Spring 4查询数据库(HTTP 500请求处理失败)   java Android |将导航抽屉添加到默认地图活动   使用CriteriaBuilder向下转换java JPA标准API。treat()方法