Скрываем настройки Django проекта в продакшене

lepiloff

Nov. 23, 2017, 3:23 p.m.

Хорошей практикой в продакшене, является сокрытие  настроек database url, password, secret key, debug status, email host, allowed hosts в файле settings.py. Большинство из этих параметров зависят от конкретного виртуального окружения. 

Python Decouple - отличная библиотека, которая поможет отделить параметры настроек от вашего кода, записывая их в специально созданный файл.

Установим библиотеку стандартным способом 

pip install python-decouple


Редактирование файла 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': 'database',
        'USER': 'name',
        'PASSWORD': 'anypass',
        'HOST': 'localhost',
        'PORT': '',
    }
}

Эти настройки и пароли мы и будем скрывать. Для этого в корне проекта создадим файл .env и запишем в него следующую информацию:

SECRET_KEY=3izb^ryglj(bvrjb2_y1fZvcnbky#358_l6-nn#i8fkug4mmz!
DEBUG=True
DB_NAME=database
DB_USER=name
DB_PASSWORD=anypass
DB_HOST=localhost

Все что находится справа от знака равенства взято из settings.py, все что слева - будем передавать в качестве переменных. Изменим settings.py следующим образом:

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': '',
    }
}

При работе с библиотекой Python Decouple, надо быть внимательным с булевыми и численными значениями, так как из файла .env значения передаются в виде строк, необходимо допонительно указывать параметры cast. Например:

DEBUG = config('DEBUG', cast=bool)
EMAIL_PORT = config('EMAIL_PORT', cast=int)

Есть возможность указывать дефолтные значения, в случае если файл .env не содержит необходимые нам данные.

DEBUG = config('DEBUG', default=True, cast=bool)

django