如何使用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.pyproduction_settings.py,仅使用一个settings.py为你的整个项目。

 

发表评论