如何使用Python解耦
Web应用程序依赖多个参数才能在不同的环境中正常运行。仅举Django应用设置为例:数据库url,密码,秘密密钥,调试状态,电子邮件主机,允许的主机。这些参数大多数是特定于环境的。在开发环境中,您可能需要在调试模式下运行应用程序。另外,将密钥保存在安全的地方(而不是在git存储库中)也是一个聪明的主意。
Python Decouple是一个很棒的库,可以帮助您严格地将设置参数与源代码分开。这个想法很简单:与项目相关的参数直接进入源代码。与项目实例相关的参数进入环境文件。
以下是如何使用Python Decouple库的快速入门。
安装
$ pip install python-decouple
如果愿意,也可以从PyPI下载。
用法
让我们考虑以下settings.py
文件,以说明如何使用该库。
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SECRET_KEY = '3izb^ryglj(bvrjb2_y1fZvcnbky#358_l6-nn#i8fkug4mmz!'
DEBUG = True
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'HELLO_DJANGO',
'USER': 'U_HELLO',
'PASSWORD': 'hA8(scA@!fg3*sc&xaGh&6%-l<._&xCf',
'HOST': '127.0.0.1',
'PORT': '',
}
}
首先.env
在项目的根目录中创建一个名为的文件。如果.ini
文件.env
不适合您的用例,您也可以使用文件。请参阅文档以获取更多说明。
SECRET_KEY=3izb^ryglj(bvrjb2_y1fZvcnbky#358_l6-nn#i8fkug4mmz!
DEBUG=True
DB_NAME=HELLO_DJANGO
DB_USER=U_HELLO
DB_PASSWORD=hA8(scA@!fg3*sc&xaGh&6%-l<._&xCf
DB_HOST=127.0.0.1
如果您使用的是Git,请更新.gitignore
添加的.env
文件,以免将任何敏感数据提交到远程存储库。
现在导入库:
from decouple import config
检索设置参数:
import os
from decouple import config
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SECRET_KEY = config('SECRET_KEY')
DEBUG = config('DEBUG', cast=bool)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': config('DB_NAME'),
'USER': config('DB_USER'),
'PASSWORD': config('DB_PASSWORD'),
'HOST': config('DB_HOST'),
'PORT': '',
}
}
投射数据
注意投说法。Django期望DEBUG
是布尔值。以类似的方式,它期望EMAIL_PORT
是整数。
DEBUG = config('DEBUG', cast=bool)
EMAIL_PORT = config('EMAIL_PORT', cast=int)
实际上,cast参数可以接收任何callable,这会将字符串值转换为其他值。对于ALLOWED_HOSTS
,Django需要一个主机名列表。
在.env
文件中,您可以这样输入:
ALLOWED_HOSTS=.localhost, .herokuapp.com
然后,您settings.py
可以通过以下方式检索它:
ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=lambda v: [s.strip() for s in v.split(',')])
看起来很复杂,对吧?实际上,该库附带了一个Csv帮助器,因此您无需编写所有这些代码。更好的方法是:
from decouple import config, Csv
ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv())
默认值
您可以在config
函数中添加一个额外的参数,以定义默认值,以防文件中存在未定义的值.env
。
DEBUG = config('DEBUG', default=True, cast=bool)
例如,这意味着您无需在开发环境DEBUG
中的.env
文件中定义参数。
覆盖配置文件
如果您要临时更改某些设置参数,可以使用环境变量覆盖它:
DEBUG=False python manage.py
如果您使用Django进行开发,则必须具备Python Decouple。我个人在所有Django项目中都使用它。确保您的应用程序凭证(如API密钥,Amazon S3,电子邮件参数,数据库参数)的安全非常重要,尤其是在开放源代码存储库中。也没有更多的development_settings.py
和production_settings.py
,仅使用一个settings.py
为你的整个项目。