简单分层加载env文件
项目描述
envfiles: 简单分层加载env文件
所以你已设置应用程序从环境变量中进行配置,太棒了,做得好!
现在你需要确保在运行应用程序之前所有这些变量都存在。env文件是个好东西,对吧?但是等等,它们不可能总是相同的,它们在测试、Docker和本地开发中略有不同... 这很烦人。
但这不是什么大问题,我们只需创建几个env文件并将它们加载... 但在prod中这会失败,因为env文件不会在那里... 我们只能加载存在的文件,但这有点像是一种黑客式的方法...
如果我们可以分层env文件那会怎么样?想象一下一个 base.env
CACHE_ENABLED=1
DATABASE_HOST=localhost
DATABASE_NAME=myapp
一个覆盖它的 test.env
# >> base.env
CACHE_ENABLED=0
DATABASE_NAME=myapp_test
注意第一行 # >> base.env
,其中的 # >>
是一个任意前缀,base.env
是一个相对于正在读取的文件的路径。
将envfiles指向您想要加载的文件,并让它解析变量。例如,您可以定义一个环境变量,比如ENV_FILE,包含您想要加载的env文件的相对路径
import envfiles
env_vars = envfiles.load_env_files(os.getenv("ENV_FILE"))
assert env_vars == {
"CACHE_ENABLED": "0",
"DATABASE_HOST": "localhost",
"DATABASE_NAME": "myapp_test",
}
注意envfiles
不会对您的os.environ
进行操作,也不会尝试解析或序列化变量。输出是一个字符串到字符串的字典,您如何使用它完全取决于您自己。通常,您会将其与os.environ
结合,并将其传递给您的应用程序配置解决方案。
例如,如果您使用的是environ-config
💚
import environ
import envfiles
from settings import MyConfig # your environ-config Config class
env_vars = envfiles.load(os.getenv("ENV_FILE"))
env_vars.update(os.environ) # actual environment variables have preference
config = environ.to_config(MyConfig, environ=env_vars)
为什么?
主要是挫折感。这个问题我遇到了很多次。我尝试过不同的库,但它们都没有支持分层或虽然支持但以令人惊讶的方式破坏了os.environ
。
envfiles
背后的想法是声明式定义如何加载env文件,并让您使用您想要的任何配置解决方案。
配置是您的应用程序做的第一件事,它应该尽可能快速直接。
替代方案
如果envfiles
不是您想要的,这里有一些其他选项您可能想考虑,它们都比envfiles
更成熟和功能丰富
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。