从文件或环境加载配置变量
goodconf的Python项目详细描述
定义配置变量并从环境或json/yaml加载它们 文件。还为您的 定义的配置。
安装
pip install goodconf或pip install goodconf[yaml]如果 需要分析/生成yaml文件。
快速启动
以可配置的django设置为例。
首先,在项目目录中,在 settings.py:
importbase64importosfromgoodconfimportGoodConf,ValueclassConfig(GoodConf):"Configuration for My App"DEBUG=Value(default=False,help="Toggle debugging.")DATABASE_URL=Value(default='postgres://localhost:5432/mydb',help="Database connection.")SECRET_KEY=Value(initial=lambda:base64.b64encode(os.urandom(60)).decode(),help="Used for cryptographic signing. ""https://docs.djangoproject.com/en/2.0/ref/settings/#secret-key")
接下来,使用settings.py文件中的配置:
importosimportdj_database_urlfrom.confimportConfigBASE_DIR=os.path.dirname(os.path.dirname(__file__))config=Config(default_files=["/etc/myproject/myproject.yaml",os.path.join(BASE_DIR,"myproject.yaml"),]).load()DEBUG=config.DEBUGSECRET_KEY=config.SECRET_KEYDATABASES={"default":dj_database_url.parse(config.DATABASE_URL)}
在最初的开发人员安装说明中,提供一些建议,例如:
python -c "import myproject; print(myproject.config.generate_yaml(DEBUG=True))" > myproject.yaml
用法
GoodConf
您的子类GoodConf对象可以用以下方法初始化 关键字参数:
- file_env_var
- 可用于 要加载的配置文件的名称。
- default_files
- 如果没有文件传递给load方法,请尝试加载 按顺序配置这些文件。
- load
- 在实例化期间触发加载方法。默认为false。
生成配置时使用纯文本docstring作为标题 文件。
Value
通过子类化GoodConf和定义类来声明配置值 属性是Value实例。它们可以用 以下关键字参数:
- default
- 如果未提供默认值。如果未设置,加载 未能提供此值的配置将引发接受 RequiredValueMissing异常。
- initial
- 生成配置时要使用的初始值
- cast_as
- 要将变量强制转换为的python类型。默认为默认类型 (如有)或街道
- help
- 值的纯文本描述。
django用法
提供了一个助手,monkey将django的管理命令修补到 接受一个--config参数。将manage.py替换为以下内容:
# Define your GoodConf in `myproject/__init__.py`frommyprojectimportconfigif__name__=='__main__':config.django_manage()
为什么?
我从logan(使用 哨兵)和derpconf(由 拇指)。不过,两者都使用python文件进行配置。我想要一个更安全的 一种更容易从配置中序列化数据的格式 管理系统。
环境变量
我不喜欢处理环境变量。首先,有潜力 安全问题:
- 通过日志或错误报告服务意外泄漏。
- 子进程继承(请参见ImageTragick 想知道为什么会这样。
其次,在部署环境的实践中,环境变量最终会 写入许多文件(cron、bash profile、服务定义, web服务器配置等)。它不仅麻烦,而且增加了 可能通过不正确的文件权限泄漏。
我更喜欢由应用程序显式读取的单个结构化文件。 我也希望在像heroku这样的服务上运行我的应用程序很容易 其中环境变量是首选配置方法。
这个模块让我在我控制的环境中按自己喜欢的方式做事,但是 仍然在我无法控制的环境中使用环境变量运行它们 小题大做。