• Информация на сайте предоставляется «как есть», может содержать неточности и не является консультацией или офертой.
  • Перед использованием проконсультируйтесь со специалистом.

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

Сайт использует cookies для работы и сбора аналитики. Вы можете принять или настроить их, а также полностью отключить в настройках браузера.

Настройки cookies
Необходимые для работы веб-сайта

Используются для входа, навигации и защиты (например: sessionid, csrftoken). Без них сайт может работать с перебоями.

Помогают улучшить сайт, собирая статистику посещений (например, через Яндекс Метрику).

Используются для показа персонализированной рекламы и ретаргетинга в рекламных сетях.

Настройки интерфейса

Декоративный эффект свечения при клике по странице.

DEV -
PROGRAM.RU
Контакты

Переменные окружения и секретные ключи в 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

Хранить переменные окружения на Python принято в .env файле.

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

plaintext
# Общие настройки
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.example

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

Как прочитать переменную окружения на python

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

Как получить переменные окружения через os.environ

Получение переменных окружения через os.environ это нативный метод, то есть не требуется что либо устанавливать.

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

import os

API_KEY = os.environ.get("API_KEY")

## или 

API_KEY = os.environ["API_KEY"]

пример использования os.environ

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

Как получить переменные окружения через python-dotenv

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

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 в этой статье.

При разработке сайта на 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

python
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).

Если у вас остались вопросы по переменным окружениям, вы можете обратиться за консультацией к программисту.

Вам может быть интересно

Поделиться
Ничего не найдено
Найдите нужную страницу

Статьи, инструменты и помощь