Использование переменных окружения для конфигурирования Django

Крайне удобно, когда можно гибко управлять настройками своего приложения. Такими как подключение к базе данных, какие-то магические константы или ключи шифрования приложения. В Django есть механизм конфигурационных файлов, однако они не удобны тем, что они попадают в репозиторий. А это, во-первых, создаёт смешение отвественности. Репозиторий нужен для хранения исходных кодов, а не данных доступа и настроек сред. А, во-вторых, если одно и то же приложение используется в нескольких окружениях (даже дев/тест/прод) то возникает головная боль с сопровождением этих настроек и поддержкой их в актуальном состоянии. Решением этой проблемы могут стать переменные окружения.

Что такое переменные окружения

Если не вдаваться глубоко, то переменные окружения это значения, которые могут меняться в зависимости от того, где запущена программа. Хорошим примером, знакомым для всех веб-разработчиков, являются переменные окружения CGI, в которых хранятся значения домена, по которому произошёл запрос, IP адреса сервера и прочие любопытные значения. Другим примером может быть значение текущей директории в линуксе или виндовс в терминале. Которое тоже можно получить из значений переменных окружения.

Переменными окружения обычно конфигурируются параметры работы приложения в CI/CD средах, в Docker-контейнерах, в различных сессиях терминала. Удобно просто настраиваить приложение у каждого клиента через переменные окружения и в репозитории хранить только исходный код.

Примеры переменных окружения

Переменные окружения устанавливаются или через интерфейс операционной системы (системное API или через интерфейс/конфигурацию), через команды терминала или конфигурационным файлом. К примеру, просмотреть список в терминале Linux/Mac можно с помощью команды env в терминале

Конфигурационный файл переменных окружения по соглашению называется .env, а его пример, который можно хранить в репозитории вместе с исходными кодами .env.example .

Сам конфигурационный файл представляет собой просто строки, содержащие название переменной и её значение, разделённые знаком = . Файл может содержать комментарии, начинающиеся с символа #

К примеру, конфигурационный файл одного из djnago-проектов:

Как видно, его содержимое ничем не отличается от вывода командой env

Переменные окружения в Django

Одним из способов получить значение переменных в Django является получение значения с помощью стандартной библиотеки Python os.

Создадим представление в проекте Django (проект доступен на GitHub):

И шаблон для него с выводом переменных окружения

В итоге, мы получили список переменных внутри докер-контейнера, в котором запущен проект:

Пример вывода переменных окружения докер-контейнера

Работа с django-environ

Чтобы воспользоваться более удобным способом, который позволяет использовать .env файлы нужно подключить библиотеку django-environ. Пользоваться этой библиотекой удобнее, потому что она поддерживает в том числе специальный синтаксис для установки параметров, специфичных для Django.

Для начала работы установим библиотеку:

Далее, необходимо прочитать файлы переменных окружения в том месте где мы будем их использовать. Самое очевидное место для этого — файл settings.py. Добавим код:

В нашем примере я это сделаю в файле представлений:

И создадим конфигурационный файл .env с содержимым

Таким образом, мы считаем переменную, которой ещё не было в нашем окружении из конфигурационного файла .env в директории с приложением environs

Пример вывода переменной окружения из конфигурационного файла

Вуаля, мы получили то что ожидали. Это приятно )

Более подробно о фичах библиотеки можно прочитать на официальном сайте библиотеки django-environ

Исходный код проекта доступен на GitHub