Категории

Проект
Циклы статей

25 октября 2017 г. 20:41 (ред. 25 октября 2017 г. 20:41)
О пакете, позволяющем определить тип окружения и работать с его переменными.
В прошлое воскресенье опубликовал новый пакет — envbox.
С его помощью можно упростить задачу определения типа окружения, а также работу с его переменными.

Допустим, у вас имеется приложение, которое в зависимости от окружения, по-разному функционирует, используя различные настройки: для окружения разработки используются одни, а для боевого — другие). Вот как можно определить его тип при помощи envbox:

    from envbox import get_environment


# Автоматически определим объект окружения.
# По умолчанию тип окружения считывается из
# 1. Переменной окружения PYTHON_ENV;
# 2. Содержимого файла environment в рабочей директории.
# Однако всё это можно настроить.
env = get_environment()
env.name # Наименование типа окружения: development
env.is_production # Боевое ли это окружение: False
env.get('HOME') # Содержимое переменной HOME: /home/idle/
env.getmany('PYTHON') # Переменные, начинающихся с PYTHON: {'UNBUFFERED': '1', 'PATH': ...}
env.getmany_casted('PYTHON') # То же, но с авто-приведением типов {'UNBUFFERED': 1, 'PATH': ...}

Таким образом, мы не только определили тип текущего окружения, но и считали интересующие нас данные.

Довольно частым сценарием является хранение настроек для различных типов окружения в различных модулях, например настройки Django-проекта могут быть разбиты по типам окружения следующим образом:

https://img-fotki.yandex.ru/get/477594/153990.b/0_8a920_90301e61_orig.png

При таком раскладе файлы с настройками под конкретное окружение (settings_production, settings_development, settings_testing) обычно импортируют базовые настройки из settings_base и дополняют/изменяют их нужным образом.

В классическом варианте для подгрузки нужного модуля мы передаём имя желаемого модуля в переменной окружения DJANGO_SETTINGS_MODULE, но иногда очень удобно иметь единую точку (модуль) конфигурирования, например, чтобы всегда подгружать settings, а уж он сам пусть подгружает модуль для текущего окружения. Такого можно добиться при помощи envbox:

    # Файл settings.py будет служить единой точкой конфигурирования.
from envbox import import_by_environment

# Нижеследующая команда определит тип окружения
# и импортирует его символы (переменные, функции и др.)
# прямо сюда.
import_by_environment()

Вот, вкратце, что умеет envbox. О том, как настроить под свои нужды механизмы определения типа окружени и о многом другом, можно узнать в документации (англ.) — http://envbox.readthedocs.io/.

Проект разрабатывает открыто — https://github.com/idlesign/envbox.
Желающие могут присоединяться.

Хорошего вам окружения.