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


Пример 1

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

Плохо:


def main():
POSTGRES_DSN = 'postgres://postgres:postgres@postgres:5432/postgres'

Хорошо:


from environs import Env


def main():
    env = Env()
    env.read_env()

    POSTGRES_DSN = env.str('POSTGRES_DSN')

Хорошо:


import os

from dotenv import load_dotenv


def main():
    load_dotenv()

    POSTGRES_DSN = os.getenv('POSTGRES_DSN')


Пример 2

Адрес http://localhost:8000 может измениться. Следует вынести его в отдельную настройку - это позволит менять адрес за пределами кода.

Плохо:


def main():
product_url = 'http://localhost:8000/api/products'
cart_url = 'http://localhost:8000/api/carts'

Хорошо:


from environs import Env
from urllib.parse import urljoin


def main():
    env = Env()
    env.read_env()

    base_url = env.str('SERVICE_URL')
    product_url = urljoin(base_url, 'api/products')
    cart_url = urljoin(base_url, 'api/carts')


Пример 3

Настройка SECRET_KEY — это секретный ключ, с помощью которого шифруют пароли пользователей сайта. Если SECRET_KEY попадет не в те руки, то под угрозой взлома окажутся пароли всех пользователей сайта. Доверить ключ можно только администратору сервера: он спрячет ключ на сервере и сообщит его сайту при запуске через переменную окружения.

Плохо:


def main():
SECRET_KEY = 'cdl3v0giob0_q!or$c2-7kvrui69pg^f$y'

Хорошо:


from environs import Env


def main():
    env = Env()
    env.read_env()

    SECRET_KEY = env.str('SECRET_KEY')

Хорошо:


import os

from dotenv import load_dotenv


def main():
    load_dotenv()

    SECRET_KEY = os.getenv('SECRET_KEY')


Пример 4

Настройка ALLOWED_HOSTS нужна для безопасности вашего сайта. Она защищает от нескольких видов атак злоумышленников. Для защиты нужно, чтобы в этой переменной был указан домен, в котором развёрнут сайт. Как правило, default настройку для ALLOWED_HOSTS ставят ['127.0.0.1', 'localhost'].

Плохо:


def main():
ALLOWED_HOSTS = ['127.0.0.1', 'localhost']

Хорошо:


from environs import Env


def main():
    env = Env()
    env.read_env()

    ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', ['127.0.0.1', 'localhost'])


Пример 5

DEBUG активирует отладочный режим работы сайта. На локальной машине значение этой переменной обычно равняется True, а на production сервере — False. Как правило, в качестве default значения для DEBUG указывают False.

Плохо:


def main():
DEBUG = False

Плохо:


def main():
DEBUG = True

Хорошо:


from environs import Env


def main():
    env = Env()
    env.read_env()

    DEBUG = env.bool(DEBUG, False)