使用环境变量和pydantic的简单DRY配置。
项目描述
dryenv
使用环境变量和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。
DryEnv
是pydantic.BaseSettings
的一个薄包装,它完成了大部分繁重的工作。DryEnv
通过自动执行一些操作,使得事情变得稍微整洁和方便。
- 根据类名设置
env_prefix
,除非类名是Root
(不区分大小写),在这种情况下,前缀为空。 - 实例化类以触发环境查找。
例如,这
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提供的一些最重要的功能点
- 您可以选择省略默认值,只需声明一个带有类型注解的变量,例如
HOST: str
。这使得设置成为必需的。 - 变量将根据其类型进行解析,该类型由注解或默认值确定。
- 对于大多数简单字段类型(例如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_HOST
和 DATABASE_USERNAME
将成为全局变量。这在例如 Django 中很有用,其中设置需要在全局级别声明。您可以传递自己的字典给函数使用,而不是当前的全球变量。
与Django和PyCharm的使用
如果您使用 PyCharm 并与 Django 集成,它能够智能地检查并导航到 django.conf.settings
中的值...大多数时候。由于某种原因,在 settings.py
中声明的类不起作用,因此您无法导航到 DryEnv
的定义或自动完成其值。为了解决这个问题,我建议您
- 在另一个文件中声明适当的设置,例如
simple_settings.py
。 - 在您的应用程序中导入那里的值,而不是从
django.conf.settings
,这样 PyCharm 就能理解它们。 - 在您的
settings.py
中,写入from simple_settings import *
并在设置文件中调用populate_globals()
。这将允许 Django 和库在全局级别找到设置如DEBUG
和SECRET_KEY
,同时让您使用dryenv
定义它们,然后忘记它们。
或者,您可以添加行 DATABASE = DATABASE
或 DATABASE = DATABASE()
,然后 PyCharm 将将其识别为普通变量而不是类。
项目详情
dryenv-0.1.1.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 09d41fd1d18cddfd0095037654f85e90f512d9d221d09cd37b23bd8107d93c8f |
|
MD5 | b6f71daba59ebe8d7078b4b3307fe3e5 |
|
BLAKE2b-256 | dde4caa41628b43841a57026e76ac601429b4089fbda3347047397ca46d52a14 |