在这篇文章中,我将分享我经常使用的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')
)
}
就这样,我们得到了一个总结。我希望这篇文章对你有用,并使你更容易将配置与代码分开,我完全同意"十二要素应用 "的观点,这很重要。