任何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_CONFIGURATION
env变量,使每个环境都可以
使用不同的键。在
密钥存储在加密的环境变量或加密文件中。
默认情况下,源文件位于~/.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命令
- 项目
标签: