从文件或环境加载配置变量

goodconf的Python项目详细描述


https://img.shields.io/travis/lincolnloop/goodconf.svghttps://img.shields.io/codecov/c/github/lincolnloop/goodconf.svghttps://img.shields.io/pypi/v/goodconf.svghttps://img.shields.io/pypi/pyversions/goodconf.svg

定义配置变量并从环境或json/yaml加载它们 文件。还为您的 定义的配置。

安装

pip install goodconfpip 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文件进行配置。我想要一个更安全的 一种更容易从配置中序列化数据的格式 管理系统。

环境变量

我不喜欢处理环境变量。首先,有潜力 安全问题:

  1. 通过日志或错误报告服务意外泄漏。
  2. 子进程继承(请参见ImageTragick 想知道为什么会这样。

其次,在部署环境的实践中,环境变量最终会 写入许多文件(cron、bash profile、服务定义, web服务器配置等)。它不仅麻烦,而且增加了 可能通过不正确的文件权限泄漏。

我更喜欢由应用程序显式读取的单个结构化文件。 我也希望在像heroku这样的服务上运行我的应用程序很容易 其中环境变量是首选配置方法。

这个模块让我在我控制的环境中按自己喜欢的方式做事,但是 仍然在我无法控制的环境中使用环境变量运行它们 小题大做。

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

推荐PyPI第三方库


热门话题
java关闭应用程序按钮Listener   Java中的多线程同步在Java示例中的思考   java如何查看Tomcat正在使用/访问的JAR?   java My代码在调用垃圾收集器后不会终止   多线程Java连接线程池和connectionfactory?   java在运行时修改JAR文件   java Android:使用光标时引发IllegaleException   在Netbeans中测试不可执行库的java?   泛型在参数上强制子类Java类型   spring Java:继承与依赖注入“自动连线”   javascript如何解析这个xml元素   java打印特定序列中的数组   带有ProcessingTimeSessionWindow的java Apache Flink自定义触发器   java如何配置消息驱动的Bean应用程序和Glassfish来使用来自远程MessageBroker的消息?