Переменные окружения и секретные ключи в Python
Узнайте, как безопасно хранить секретные ключи и переменные окружения с помощью .env файлов в Python и Django.
В этой статье разберём, почему нельзя хранить конфиденциальные данные в открытом виде, как правильно хранить секретные ключи, какие способы работы с переменными окружения существуют и какие библиотеки могут нам помочь.
Переменные окружения (с анг. environment variables) это значения, которые программа получает во время запуска от операционной системы или изолированной среды.
Такие значения, могут быть любого характера: паролями, API-ключами, секретными токенами и другими типами важной информации.
Переменные окружения выполняют полезную функцию, отделяют настройки от кода.
У вас может быть 1 переменная PRODUCTION=true/false (боевой режим=вкл./выкл.), но может быть несколько программ на разных языках программирования.
Если вы вынесли эту настройку в переменные, то вам достаточно изменить ее в 1 месте и все программы будут работать с такой настройкой.
В любом Python проекте рано или поздно появляются данные, которые нельзя показывать посторонним: ключи API, пароли от баз данных, токены сторонних сервисов.
Чувствительные данные оставленные в коде могут быть опубликованы или переданы третьим лицам, которые могут воспользоваться и нанести ущерб вам или вашему проекту.
export API_KEY="123456789"команда создания переменной окружения на Linux / macOS
$env:API_KEY="123456789"команда создания переменной окружения на Windows PowerShell
Хранить переменные окружения на Python принято в .env файле.
Такой файл по умолчанию не сохраняется в системе контроля версий git и иных системах, чтобы избежать утечек данных.
# Общие настройки
DEBUG=True
SECRET_KEY=secret-key
ALLOWED_HOSTS=127.0.0.1,localhost
# База данных
DATABASE_HOST=localhost
DATABASE_PORT=12345
# API ключи
API_KEY=1b23C45a6пример .env файла
Хорошей практикой является хранить пустую или наполненную случайными данными версию .env файла с названием файла .env.example, для того чтобы при необходимости поделиться проектом без чувствительных данных в реальном .env, но в тоже время предоставить возможность запустить проект, например в целях тестирования.
Для чтения переменных окружения существуют несколько способов, как нативным методом, так и при помощи сторонних библиотек.
Получение переменных окружения через os.environ это нативный метод, то есть не требуется что либо устанавливать.
Однако отрицательная сторона такого подхода в том, что он не загружает данные из .env файла, используя только уже загруженные переменные.
import os
API_KEY = os.environ.get("API_KEY")
## или
API_KEY = os.environ["API_KEY"]пример использования os.environ
В примере выше, если переменная отсутствует в окружении, круглые скобки нам дадут результат None или же мы можем задать значение по умолчанию, квадратные скобки выдадут ошибку и прекращение работы.
python-dotenv это простая библиотека, которая работает на базе os.environ, ее отличие лишь в том, что она умеет загружать переменные окружения из .env файла с указанием своего пути.
В ней так же можно задать значение по умолчанию.
pip install python-dotenvкоманда установки python-dotenv
from dotenv import load_dotenv
import os
load_dotenv()
API_KEY = os.getenv("API_KEY")пример использования python-dotenv
environs это библиотека, которая имеет зависимость от python-dotenv, потому здесь так же можно извлекать переменные из .env файла, а так же прописывать свой путь расположения файла и значение по умолчанию.
В дополнение, библиотека позволяет указывать конкретные типы данных для каждой из переменной (строки, списки, числа и т.д.).
pip install environsкоманда установки environs
from environs import Env
env = Env()
env.read_env()
API_KEY = env.str("API_KEY")
DEBUG = env.bool("DEBUG", default=False)
PORT = env.int("PORT", default=8000)пример использования environs
Прежде мы рассмотрели основы django в этой статье.
При разработке сайта на Django в корне проекта в файле settings.py находятся настройки, которые могут содержать конфиденциальные и чувствительные данные: SECRET_KEY, ALLOWED_HOSTS, пароли от базы данных, API-ключи, токены и настройки сторонних сервисов.
Чтобы не хранить такие данные непосредственно в исходном коде, можно использовать библиотеку environs.
Создадим в корне проекта файл .env
SECRET_KEY=django-insecure-example-key
DEBUG=True
ALLOWED_HOSTS=localhost,127.0.0.1
пример .env файла для Django
В settings.py создадим объект Env и загрузим переменные из .env
from environs import Env
env = Env()
env.read_env()
SECRET_KEY = env.str("SECRET_KEY")
DEBUG = env.bool("DEBUG", default=False)
ALLOWED_HOSTS = env.list("ALLOWED_HOSTS", default=[])
пример кода в settings.py
Теперь ваши данные должны быть доступны в этих переменных, вы можете посмотреть это через команду print() , например print(DEBUG).
Если у вас остались вопросы по переменным окружениям, вы можете обратиться за консультацией к программисту.
По необходимости вы можете обратиться за консультацией
Вам может быть интересно

Как создать виртуальное окружение python venv

Как открыть XML-файл и посмотреть его в читаемом виде
Django CBV: что такое Class-Based Views и зачем они

Почему сложно конвертировать Word 2003 с MathType в PDF

Ваш первый сайт на Django: обзор фреймворка на Python
