跳转到主要内容

未提供项目描述

项目描述

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_urldjango_cache_urldj_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())

您应该检查模块的代码以查看默认值;它们是从正在替换的库中采用的,但当你不确定的时候,最好检查两次。

由以下支持

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