跳转到主要内容

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

项目描述

https://github.com/lincolnloop/goodconf/actions/workflows/test.yml/badge.svg?branch=main&event=push pre-commit.ci status https://img.shields.io/codecov/c/github/lincolnloop/goodconf.svg https://img.shields.io/pypi/v/goodconf.svg https://img.shields.io/pypi/pyversions/goodconf.svg

对 Pydantic 的设置管理的轻量级封装。[链接](https://docs.pydantic.org.cn/usage/settings/) 允许您定义配置变量并从环境或 JSON/YAML 文件中加载它们。还可以生成您定义的配置的初始配置文件和文档。

安装

使用以下命令安装:pip install goodconfpip 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 文件进行配置。我想使用更安全的格式,并且更容易从配置管理系统序列化数据。

环境变量

我不喜欢使用环境变量。首先,存在潜在的安全问题

  1. 通过日志记录或错误报告服务意外泄露。

  2. 子进程继承(参见 ImageTragick 了解为什么这可能很糟糕)。

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

我更喜欢一个单一的结构化文件,该文件被应用程序明确读取。我还想让它在与环境变量(这是首选配置方法)兼容的服务(如 Heroku)上运行我的应用程序变得容易。

此模块使我能够在控制环境中按照自己的喜好行事,但在不控制的环境中运行它们时,仍然可以通过环境变量以最小的麻烦运行。

贡献

创建虚拟环境并安装包及其依赖项。

pip install -e ".[tests]"

运行测试

pytest

每当创建新的标签时,使用GitHub Actions进行发布。更多信息,请参阅./.github/workflows/build.yml

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。

源分布

goodconf-5.0.0.tar.gz (13.3 kB 查看哈希值)

上传时间

构建分布

goodconf-5.0.0-py3-none-any.whl (10.5 kB 查看哈希值)

上传时间 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面