从文件或环境加载配置变量
项目描述
对 Pydantic 的设置管理的轻量级封装。[链接](https://docs.pydantic.org.cn/usage/settings/) 允许您定义配置变量并从环境或 JSON/YAML 文件中加载它们。还可以生成您定义的配置的初始配置文件和文档。
安装
使用以下命令安装:pip install goodconf 或 pip install goodconf[yaml] / pip install goodconf[toml] 如果需要解析/生成 YAML/TOML 文件。
快速开始
让我们以可配置的 Django 设置为例。
首先,在项目目录中创建一个 conf.py 文件,放在 settings.py 旁边。
import base64
import os
from goodconf import GoodConf, Field
from pydantic import PostgresDsn
class AppConfig(GoodConf):
"Configuration for My App"
DEBUG: bool
DATABASE_URL: PostgresDsn = "postgres://localhost:5432/mydb"
SECRET_KEY: str = Field(
initial=lambda: base64.b64encode(os.urandom(60)).decode(),
description="Used for cryptographic signing. "
"https://docs.django.ac.cn/en/2.0/ref/settings/#secret-key")
model_config = {"default_files": ["/etc/myproject/myproject.yaml", "myproject.yaml"]}
config = AppConfig()
接下来,在您的 settings.py 文件中使用该配置。
import dj_database_url
from .conf import config
config.load()
DEBUG = config.DEBUG
SECRET_KEY = config.SECRET_KEY
DATABASES = {"default": dj_database_url.parse(config.DATABASE_URL)}
在您的初始开发者安装说明中,提供一些建议,例如
python -c "import myproject; print(myproject.conf.config.generate_yaml(DEBUG=True))" > myproject.yaml
最好是将其作为一个函数和 入口点,这样您就可以安装项目并运行类似 generate-config > myproject.yaml 的命令。
用法
GoodConf
您的子类化的 GoodConf 对象可以包含一个 model_config 字典,具有以下属性
- file_env_var
可以用于加载配置文件名称的环境变量的名称。
- default_files
如果没有传递文件到 load 方法,则按顺序尝试从这些文件加载配置。
它还有一个方法
- load
在实例化期间触发加载方法。默认为 False。
使用纯文本文档字符串作为生成配置文件时的标题。
环境变量始终优先于配置文件中的变量。
有关加载示例,请参阅 Pydantic 的文档
字段
通过子类化 GoodConf 并定义类属性(标准 Python 类型定义或由 Field 函数生成的 Pydantic FieldInfo 实例)来声明配置值。
Goodconf 可以使用 Field 提供的额外参数来定义一个函数,该函数可以生成字段的初始值
- initial
用于生成配置时的初始值的可调用函数
Django 用法
提供了一个辅助工具,该工具通过猴子补丁 Django 的管理命令来接受 --config 参数。将您的 manage.py 替换为以下内容
# Define your GoodConf in `myproject/conf.py`
from myproject.conf import config
if __name__ == '__main__':
config.django_manage()
为什么?
我从 logan (由 Sentry 使用)和 derpconf (由 Thumbor 使用)中获得了灵感。然而,两者都使用了 Python 文件进行配置。我想使用更安全的格式,并且更容易从配置管理系统序列化数据。
环境变量
我不喜欢使用环境变量。首先,存在潜在的安全问题
通过日志记录或错误报告服务意外泄露。
子进程继承(参见 ImageTragick 了解为什么这可能很糟糕)。
其次,在实际部署环境中,环境变量最终会写入到多个文件中(cron、bash profile、服务定义、Web 服务器配置等)。这不仅麻烦,而且增加了通过不正确的文件权限泄露的可能性。
我更喜欢一个单一的结构化文件,该文件被应用程序明确读取。我还想让它在与环境变量(这是首选配置方法)兼容的服务(如 Heroku)上运行我的应用程序变得容易。
此模块使我能够在控制环境中按照自己的喜好行事,但在不控制的环境中运行它们时,仍然可以通过环境变量以最小的麻烦运行。
贡献
创建虚拟环境并安装包及其依赖项。
pip install -e ".[tests]"
运行测试
pytest
每当创建新的标签时,使用GitHub Actions进行发布。更多信息,请参阅./.github/workflows/build.yml
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。