跳转到主要内容

使用环境变量和pydantic的简单DRY配置。

项目描述

dryenv

Build Status Coverage Status Supports Python versions 3.6+

使用环境变量和pydantic的简单配置,无需重复!

pip install dryenv

基本用法

例如,而不是编写

# settings.py

import os

DATABASE_HOST = os.getenv("DATABASE_HOST", "localhost")
DATABASE_USERNAME = os.getenv("DATABASE_USERNAME", "admin")
DATABASE_PASSWORD = os.getenv("DATABASE_PASSWORD", "secretpassword")
DATABASE_TIMEOUT = int(os.getenv("DATABASE_TIMEOUT", 10))
DATABASE_PERSIST_CONNECTION = os.getenv("DATABASE_PERSIST_CONNECTION", "true").lower() == "true"

# database.py

import settings

connection = connect(
    host=settings.DATABASE_HOST,
    username=settings.DATABASE_USERNAME,
    password=settings.DATABASE_PASSWORD,
    timeout=settings.DATABASE_TIMEOUT,
    persist_connection=settings.DATABASE_PERSIST_CONNECTION,
)

# settings.py

from dryenv import DryEnv

class DATABASE(DryEnv):
    HOST = "localhost"
    USERNAME = "admin"
    PASSWORD = "secretpassword"
    TIMEOUT = 10
    PERSIST_CONNECTION = True

# database.py

from settings import DATABASE

connection = connect(
    host=DATABASE.HOST,
    username=DATABASE.USERNAME,
    password=DATABASE.PASSWORD,
    timeout=DATABASE.TIMEOUT,
    persist_connection=DATABASE.PERSIST_CONNECTION,
)

甚至

# settings.py

from dryenv import DryEnv

class DATABASE(DryEnv):
    # Looking up environment variables is case-insensitive
    host = "localhost"
    username = "admin"
    password = "secretpassword"
    timeout = 10
    persist_connection = True

# database.py

from settings import DATABASE

connection = connect(**DATABASE.dict())

基于pydantic。

DryEnvpydantic.BaseSettings的一个薄包装,它完成了大部分繁重的工作。DryEnv通过自动执行一些操作,使得事情变得稍微整洁和方便。

  1. 根据类名设置env_prefix,除非类名是Root(不区分大小写),在这种情况下,前缀为空。
  2. 实例化类以触发环境查找。

例如,这

from dryenv import DryEnv

class DATABASE(DryEnv):
    HOST = "localhost"
    USERNAME = "admin"
    PASSWORD = "secretpassword"
    TIMEOUT = 10
    PERSIST_CONNECTION = True

大致相当于

from pydantic import BaseSettings

class DATABASE(BaseSettings):
    class Config:
        env_prefix = "DATABASE_"

    HOST = "localhost"
    USERNAME = "admin"
    PASSWORD = "secretpassword"
    TIMEOUT = 10
    PERSIST_CONNECTION = True

DATABASE = DATABASE()

以下是pydantic提供的一些最重要的功能点

  1. 您可以选择省略默认值,只需声明一个带有类型注解的变量,例如HOST: str。这使得设置成为必需的。
  2. 变量将根据其类型进行解析,该类型由注解或默认值确定。
  3. 对于大多数简单字段类型(例如int、float、str等),环境变量的值将按与直接传递给初始化器的方式相同的解析方式解析。布尔值将更智能地解析,请参阅此处。像列表、集合、字典和子模型这样的复杂类型将从环境变量中填充,将环境变量的值作为JSON编码的字符串处理。

有关更多信息,请阅读pydantic文档

这个包可以很容易地成为pydantic本身的一部分。如果您想这样做,在此处投票

配置DryEnv

您可以通过以下方式之一覆盖自动的 env_prefix 设置:

  • 将您的类命名为 Root(不区分大小写),在这种情况下,前缀为空,或者
  • Config 类中正常设置 env_prefix

您可以在 Config 中设置 auto_init = False 来关闭自动实例化。

您可以通过将其作为类来调用,以自己的构造函数参数实例化 DryEnv。您还可以使用 type() 正常访问该类本身。

附加功能

DryEnv.prefixed_dict() 实例方法类似于 pydantic 的 dict(),但 env_prefix 包含在键中,因此它们与原始环境变量名称匹配。

例如

class DATABASE(DryEnv):
    HOST = "localhost"
    USERNAME = "admin"

assert DATABASE.dict() == {"HOST": "localhost", "USERNAME": "admin"}
assert DATABASE.prefixed_dict() == {"DATABASE_HOST": "localhost", "DATABASE_USERNAME": "admin"}

populate_globals() 函数将在调用上下文的全局变量中搜索 DryEnv 的实例,然后使用这些 DryEnv 实例的 prefixed_dict() 更新全局变量。例如,如果您在上述示例之后调用 populate_globals(),则 DATABASE_HOSTDATABASE_USERNAME 将成为全局变量。这在例如 Django 中很有用,其中设置需要在全局级别声明。您可以传递自己的字典给函数使用,而不是当前的全球变量。

与Django和PyCharm的使用

如果您使用 PyCharm 并与 Django 集成,它能够智能地检查并导航到 django.conf.settings 中的值...大多数时候。由于某种原因,在 settings.py 中声明的类不起作用,因此您无法导航到 DryEnv 的定义或自动完成其值。为了解决这个问题,我建议您

  1. 在另一个文件中声明适当的设置,例如 simple_settings.py
  2. 在您的应用程序中导入那里的值,而不是从 django.conf.settings,这样 PyCharm 就能理解它们。
  3. 在您的 settings.py 中,写入 from simple_settings import * 并在设置文件中调用 populate_globals()。这将允许 Django 和库在全局级别找到设置如 DEBUGSECRET_KEY,同时让您使用 dryenv 定义它们,然后忘记它们。

或者,您可以添加行 DATABASE = DATABASEDATABASE = DATABASE(),然后 PyCharm 将将其识别为普通变量而不是类。

项目详情


下载文件

下载适合您平台的项目文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。

源分布

dryenv-0.1.1.tar.gz (6.1 KB 查看散列

上传时间

由以下支持

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