如何在Python中处理环境变量

454 阅读3分钟

在这篇文章中,我将分享我经常使用的3个库,将我的环境变量与生产代码隔离。

为什么这很重要?

将配置与代码分开

正如我们在The Twelve-Factor App / III.配置

应用程序有时会将配置作为常量存储在代码中。这违反了 "十二要素",它要求将配置与代码严格分离

基本上,你希望能够独立于代码的改变来进行配置的改变。

我们还想隐藏秘密密钥和API凭证。请注意,git是非常持久的(PyCon讲座:哎呀,我把密码提交给GitHub了),所以从一开始就把这个问题解决好是很重要的。

第一个软件包:Python-dotenv

这些天我主要使用 python-dotenv这使得这个问题变得简单明了。

首先安装该库并将其添加到你的需求中(或者如果你使用Poetry,它将自动更新你的.toml 文件):

pip install python-dotenv

其次制作一个.env 文件,在其中加入你的环境变量。

重要的是,你要用git忽略这个文件,否则你最终会把敏感数据提交给你的 repo/项目。

我通常做的是提交一个空的.env-example (或.env-template )文件,这样其他开发者就知道他们应该设置什么(见这里这里的例子)。

因此,一个新的开发者(或我在另一台机器上检查 repo)可以做一个cp .env-template .env 并填充这些变量。由于(签出的).gitignore 文件包含.env ,所以git不会把它显示为一个需要暂存提交的文件。

然后,我们用两行代码来加载这个文件中的变量:

from dotenv import load_dotenv

load_dotenv()

现在你可以使用os.environ 来访问环境变量,比如说

BACKGROUND_IMG = os.environ["THUMB_BACKGROUND_IMAGE"]
FONT_FILE = os.environ["THUMB_FONT_TTF_FILE"]

要在不接触环境的情况下加载配置,你可以使用dotenv_values(".env") ,它的工作原理与load_dotenv 相同,只是它不接触环境,它只是返回一个带有从.env 文件解析的值的dict。

请查看README以了解更多的选项。

第二个软件包:Python-decouple

另一个我在Django中经常使用的库是 [python-decouple](https://pypi.org/project/python-decouple/).

这个过程非常相似:

pip install python-decouple

用你的配置变量创建一个.env 文件,然后 "gitignore "它。

然后在你的代码中你可以使用config 对象。根据文档中的例子:

from decouple import config

SECRET_KEY = config('SECRET_KEY')
DEBUG = config('DEBUG', default=False, cast=bool)
EMAIL_HOST = config('EMAIL_HOST', default='localhost')
EMAIL_PORT = config('EMAIL_PORT', default=25, cast=int)

铸造和指定默认值的能力真的很方便。

另一个有用的选项是Csv 帮助器。例如,在我们的平台(Django应用程序)的.env 文件中拥有这个:

ALLOWED_HOSTS=.localhost, .herokuapp.com

我们可以像这样在settings.py 中检索这个变量:

ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv())

第三个包:dj-database-url

既然我们在这里,我还想给你看一个包。 dj-database-url它可以让你更容易地载入你的数据库URL。

按照文档中的说法:

dj_database_url.config方法会返回一个Django数据库连接字典,其中包含了你URL中指定的所有数据。还有一个conn_max_age参数,可以轻松启用Django的连接池。

这里是如何使用它的:

import dj_database_url

DATABASES = {
    'default': dj_database_url.config(
        default=config('DATABASE_URL')
    )
}

很好,很干净!

这是我主要使用的方法,更多选项请查看python-decouple's READMEhere.


Python技巧

作为总结,这里是python-decouple 代码的简明提示,你可以轻松地粘贴到你的项目中:

# pip install python-decouple dj-database-url

from decouple import config, Csv
import dj_database_url

SECRET_KEY = config('SECRET_KEY')
DEBUG = config('DEBUG', default=False, cast=bool)
ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv())

DATABASES = {
    'default': dj_database_url.config(
        default=config('DATABASE_URL')
    )
}

就这样,我们得到了一个总结。我希望这篇文章对你有用,并使你更容易将配置与代码分开,我完全同意"十二要素应用 "的观点,这很重要。