Django settings 中存有很多私密信息,如 database url, password, secret key, allowed hosts 等,我们还可能有 Debug / Deploy 两套不同的运行环境,python-decouple 可以让这些环境变量与代码分离。

Usage

例如 settings.py 内容如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
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 文件,内容如下

1
2
3
4
5
6
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

.env 加入到 .gitignore,修改 settings.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
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': '',
    }
}

类型转换

.env 内容

1
2
3
DEBUG=True
EMAIL_PORT=25
ALLOWED_HOSTS=.localhost, .herokuapp.com

settings.py 内容

1
2
3
4
5
from decouple import config, Csv

DEBUG = config('DEBUG', default=True, cast=bool)
EMAIL_PORT = config('EMAIL_PORT', cast=int)
ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv())

也可用外部环境变量

1
DEBUG=False python manage.py