跳转到主要内容

简单的环境变量解析

项目描述

envparse2 是一个简单的工具,用于解析环境变量。

注意:envparse2envparse 的分支,后者已经不再维护,要检查原作者和代码,请访问 <https://github.com/rconradharris/envparse.git>

如果您使用Heroku以及/或者订阅 12 Factor App 的原则,您将在您的应用程序中使用大量基于环境变量的配置。 os.environ 是一个很好的起点,但随着时间的推移,您会发现自己在处理原始环境变量方面的代码大量重复。

envparse2 旨在消除这种重复的、往往不一致的解析代码,并提供一个单一、易于使用的包装器。

一些想法和代码部分来自 django-environ 项目,但使其框架无关。

安装

通过PyPI

$ pip install envparse2

用法

在您的设置或配置模块中,首先导入标准解析器或具有模式的解析器

# Standard
from envparse2 import env

# Schema
from envparse2 import Env
env = Env(BOOLEAN_VAR=bool, LIST_VAR=dict(cast=list, subcast=int))

env 可以以两种方式调用

  • 显式类型: env('ENV_VAR_NAME', cast=TYPE, ...)

  • 隐式类型(仅适用于Python内置类型): env.TYPE('ENV_VAR_NAME', ...) 如果未指定类型,无论是显式还是隐式,则默认类型为 str

转换为指定类型

# Environment variable: MAIL_ENABLED=1

mail_enabled = env('MAIL_ENABLED', cast=bool)
# OR mail_enabled = env.bool('MAIL_ENABLED')
assert mail_enabled is True

转换嵌套类型

# Environment variable: FOO=1,2,3
foo = env('FOO'), subcast=int)
# OR: foo = env('FOO', cast=list, subcast=int)
# Note that there is no way to implicitly call subcast.
assert foo == [1, 2, 3]

指定默认值

# Environment variable MAX_ROWS has not been defined

max_rows = env.int('MAX_ROWS', default=100)
assert max_rows == 100

代理值,这在Heroku中很有用,可以将他们提供的环境变量连接到应用程序实际使用的变量上

# Environment variables: MAILGUN_SMTP_LOGIN=foo,
# SMTP_LOGIN='{{MAILGUN_SMTP_LOGIN}}'

smtp_login = env('SMTP_LOGIN')
assert smtp_login == 'foo'

现在,如果您切换到使用Mandrill作为电子邮件提供商,而不是修改应用程序,您只需进行配置更改即可

SMTP_LOGIN='{{MANDRILL_UESRNAME}}'

还有一些方便的方法

  • env.json:解析JSON并返回字典。

  • env.url:解析URL并返回urlparse.ParseResult对象。

类型特定说明

  • 列表:期望的环境变量格式为FOO=1,2,3,逗号之间可以包含空格,也可以包含前导或尾随空格。

  • 字典:期望的环境变量格式为FOO='key1=val1, key2=val2。也可以包含空格。

  • JSON:期望的是标准的JSON字符串,例如FOO='{"foo": "bar"}'

模式

定义一个模式,这样您只需提供一次类型转换、子类型转换和默认值。

# Environment variables: MAIL_ENABLED=0, LIST_INT='1,2,3'

# Bind schema to Env object to get schema-based lookups
env = Env(MAIL_ENABLED=bool, SMTP_LOGIN=dict(cast=str, default='foo'),
          LIST_INT=dict(cast=list, subcast=int))
assert env('MAIL_ENABLED') is False
assert env('SMTP_LOGIN') == 'foo' # Not defined so uses default
assert env('LIST_INT') == [1, 2, 3]

Env构造函数接受以下形式的值:VAR_NAME=typeVAR_NAME=dict,其中dict是一个字典,包含以下键之一或多个:castsubcastdefault

预处理和后处理

预处理是可调用的,在执行任何类型转换之前运行在环境变量字符串上。

# Environment variables: FOO=bar

# Preprocessor to change variable to uppercase
to_upper = lambda v: v.upper()
foo = env('FOO', preprocessor=to_upper)
assert foo == 'BAR'

后处理是可调用的,在类型转换之后运行。一个例子可能是返回框架预期的数据结构。

# Environment variable: REDIS_URL='redis://:redispass@127.0.0.1:6379/0'
def django_redis(url):
  return {'BACKEND': 'django_redis.cache.RedisCache',
      'LOCATION': '{}:{}:{}'.format(url.hostname, url.port, url.path.strip('/')),
      'OPTIONS': {'PASSWORD': url.password}}

redis_config = env('REDIS_URL', postprocessor=django_redis)
assert redis_config == {'BACKEND': 'django_redis.cache.RedisCache',
    'LOCATION': '127.0.0.1:6379:0', 'OPTIONS': {'PASSWORD': 'redispass'}}

环境文件

从.env文件中读取(行分隔的KEY=VALUE)。

# This recurses up the directory tree until a file called '.env' is found.
env.read_envfile()

# Manually specifying a path
env.read_envfile('/config/.myenv')

# Values can be read as normal
env.int('FOO')

项目详情


下载文件

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

源代码分发

envparse2-0.3.0.tar.gz (8.0 kB 查看哈希值

上传时间 源代码

构建分发

envparse2-0.3.0-py2.py3-none-any.whl (6.8 kB 查看哈希值

上传时间 Python 2 Python 3

由以下支持

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