Как избежать избыточного ручного назначения переменных окружения в настройках Django?

В моем проекте Django я храню переменные конфигурации в файле .env для безопасности и гибкости. Однако каждый раз, когда я ввожу новую переменную окружения, мне приходится определять ее в двух местах: .env и settings.py.

По мере роста проекта и увеличения количества переменных окружения, settings.py наполняется избыточным переопределением того, что уже есть в .env.

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

Что я могу придумать, так это что-то вроде:

from dotenv import dotenv_values

env_variables = dotenv_values(".envs")
globals().update(env_variables)

Или даже что-то немного лучшее для работы со значениями типа list.

for key, value in env_variables.items():
    globals()[key] = value.split(",") if "," in value else value

# Ensure ALLOWED_HOSTS is always a list
ALLOWED_HOSTS = ALLOWED_HOSTS if isinstance(ALLOWED_HOSTS, list) else [ALLOWED_HOSTS]

Но я не люблю возиться с globals().

таким образом, вы можете автоматически загружать переменные среды из .env в настройки django, но использование globals().update() рискованно, поскольку оно динамически изменяет глобальное пространство имен, что может усложнить отладку

django-environ упрощает загрузку переменных среды при сохранении настроек.py чистый.

pip install django-environ

измените свой settings.py

import environ
#here we will initialize the environment variables.
env = environ.Env()
# it will read .env file
environ.Env.read_env()
#it will automatically load all the variables.
DEBUG = env.bool("DEBUG", default=False)
SECRET_KEY = env("SECRET_KEY")
ALLOWED_HOSTS = env.list("ALLOWED_HOSTS", default=[])
DATABASE_URL = env.db("DATABASE_URL", default="sqlite:///db.sqlite3")

теперь определите свой файл .env, и он будет немедленно загружен и будет без проблем работать с django.

Вернуться на верх