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

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第三方库


热门话题
在GlassFish v2中同时使用两个EntityManager时出现java错误   java中字符串生成器到字符串数组   Java中的引用传递值   java无法在Motox中查看日期和时间   java rest web服务中的默认http方法是什么   java向Android视图添加一些自定义事件/Linstener,如ListView   java试图在系统中实现变量Int。出来总体安排   java为什么这些可调用函数永远无法完成?   javacom。mysql。jdbc。MysqlDataTruncation:数据截断:第1行“DATE”列的数据太长   java如何从底部工作表对话框类使用onActivityResult   意外的Vaadin会话已过期,并行spring引导应用程序   如何在Java中比较和排序两个ArrayList   使用Grunt任务运行java自动化测试   java多线程WebSocket   组上的java JPA标准API空检查   java合并ArryList并另存为arraylist与in arraylist   mongodb Java如何从MongoDatabase类中获取DB对象作为MongoClient。getDB(dbName)已被弃用   用Java绘制JFreeChart的折线图   java如何将Springbean从spring上下文外部注册到spring上下文中?