未提供项目描述
项目描述
speckenv 因为“speck”是“点”的同义词,也因为Speck很棒。
用法
基本用法
将 ./.env 中的设置读入 os.environ
from speckenv import read_speckenv
read_speckenv()
请注意,read_speckenv 使用 os.environ.setdefault 来设置新值,这意味着如果文件中某个键存在多次,则保留第一个值,而不是最后一个。
如果文件名称不同或位于不同路径,请将完整路径作为第一个参数传递给 read_speckenv。
读取单个值
from speckenv import env
# Standard usage:
SETTING1 = env("SETTING1")
# Fallback if SETTING2 does not exist:
SETTING2 = env("SETTING2", default="bla")
# Fail hard if missing:
SETTING3 = env("SETTING3", required=True)
# Coerce the value before returning it (coercion is also applied to
# default values):
SETTING4 = env(
"SETTING4",
coerce=lambda value: date(*(int(part) for part in value.split("-"))),
default="1970-01-01",
)
以下值被评估为Python字面量,因此与值的强制类型转换相比,您可能不需要那么频繁
BOOL=True # And False, None etc. NUMBER=42 SWEET_HOME=["localhost", "127.0.0.1"]
支持等号周围额外的空白。忽略空行和以 # 开头的行
THIS_IS_IGNORED # COMMENTED_OUT=VALUE THIS = WORKS
尽管如此,您不应该在行中使用注释。它们有时会意外地工作,但这不是一个好主意。
如果一个值看起来像Python类型,但你想将其作为字符串加载,则必须在该值周围添加引号("" 或 ')或使用强制转换,例如:
NUMBER_AS_STRING = env("NUMBER", coerce=str)
# Alternatively, read the value directly from os.environ:
NUMBER_AS_STRING = os.environ["NUMBER"]
自定义映射代替 os.environ
使用与 os.environ 不同的映射可能很有用。这可以通过覆盖默认映射参数轻松实现
from speckenv import env, read_speckenv
mapping = {}
read_speckenv("file_with_variables.env", mapping=mapping)
setting1 = env("SETTING1", mapping=mapping)
Django 支持
speckenv 附带了一些用于使用环境变量配置 Django 的实用工具。这些都是纯函数,没有副作用,也不依赖于它们的环境。它们之所以与 speckenv 一起打包,是因为它们很有用,并且这样做很方便。
许多其他项目已经做到了这一点,但 speckenv_django 的不同之处在于它仅涵盖有趣的设置。此外,实现不会向 urllib.parse 添加猴子补丁。
speckenv 不依赖于 Django,如果您不想使用 Django 或 speckenv_django 模块,除了硬盘上的一些 KB 以外,您无需支付任何费用。
django_cache_url
涵盖配置 Redis、locmem 或模拟缓存后端,并可选地包含认证凭据。Redis 配置仅支持 Django 4 或更高版本。 redis:// 和 hiredis:// 是等效的,因为足够的 redis-py 版本在可用的情况下会自动选择 hiredis 解析器。
from speckenv import env
from speckenv_django import django_cache_url
# CACHE_URL=hiredis://localhost:6379/1/?key_prefix=example_com"
CACHES = {"default": django_cache_url(env("CACHE_URL", default="locmem://"))}
# NOTE! locmem:// may be a bad default, but that's up to you really.
django_database_url
涵盖配置 PostgreSQL、PostGIS 或 sqlite 数据库引擎,并包含认证凭据。
from speckenv import env
from speckenv_django import django_database_url
# DATABASE_URL=postgres://localhost:5432/example_com
DATABASES = {"default": django_database_url(env("DATABASE_URL", required=True))}
django_email_url
涵盖配置电子邮件后端。已知的后端有 smtp://、submission://(与 smtp:// 相同,但使用 TLS 和默认端口 587)、locmem://、console:// 和 dummy:。
该实用工具还支持显式请求 SSL(?ssl=true)、TLS(?tls=true)、SMTP 超时(?timeout=10),设置 DEFAULT_FROM_EMAIL 地址(?_default_from_email=info@example.com)和设置 SERVER_EMAIL 地址(?_server_email=info@example.com)。请注意,由于 Django 使用单独的变量而不是字典,您必须将返回值传递给 globals().update()。
from speckenv import env
from speckenv_django import django_email_url
# DATABASE_URL=smtp://
if DEBUG:
globals().update(django_email_url(env("EMAIL_URL", default="console://")))
else:
globals().update(django_email_url(env("EMAIL_URL", default="smtp://")))
自动替换其他 Django 12factor 库
speckenv 随带一个 Python 模块,该模块将名为 dj_database_url、django_cache_url 和 dj_email_url 的 Python 模块插入 sys.modules(如果它们尚未存在),这些模块包含调用上述函数的基本函数。这个模块几乎保证在任意环境中都不会工作,但它可能是一个快速解决方案,如果您在升级代码到 Django 4.0 时希望尽可能少地更改设置模块,并且已经使用 speckenv,那么它可能很有用。要使用它,您应该在设置模块的顶部插入以下行
import speckenv_django_patch # noqa: isort:skip
import dj_database_url, django_cache_url, dj_email_url
DATABASES = dj_database_url.config()
CACHES = django_cache_url.config()
globals().update(dj_email_url.config())
您应该检查模块的代码以查看默认值;它们是从正在替换的库中采用的,但当你不确定的时候,最好检查两次。