Конфигурация - одна из важнейших частей проекта. С него он начинается. Именно конфигурацией вы определяете с какой базой данных надо работать, какие приложения использовать, как форматировать время, как переводить ресурсы и на какие языки, и многое другое.
Решением, проверенным временем и множеством проектов, является передача конфигурационных параметров через переменные окружения. Внутри файла settings.py
остаётся только их правильно прочитать из окружения и применить.
Для получения булевых данных из переменной окружения используем функцию:
import os
def getenv_boolean(name: str, default: bool=False) -> bool:
value = os.getenv(name, default)
if isinstance(value, str):
return value.lower() == 'true'
return value
Для получения строковых данных из переменной окружения используем функцию:
import os
def getenv_string(name: str, default: str='') -> str:
value = os.getenv(name)
if value is None or value == '':
return default
return value
Для получения строковых данных из переменной окружения используем функцию:
import os
def getenv_integer(name: str, default: int=0) -> int:
return int(getenv_string(name, str(default)))
По образу и подобию пишутся остальные функции, но представленных функций достаточно для 95% случаев.
Дальше всё просто.
В файле settings.py
импортируем вышеописанные функции и определяем нужные нам переменные:
# получаем секретный ключ или генерируем временный
SECRET_KEY = getenv_string('SECRET_KEY', uuid4().hex)
# определяемся с режимами работы
DEBUG = getenv_boolean('DEBUG')
PRODUCTION = getenv_boolean('PRODUCTION')
SCHEME = 'https' if PRODUCTION else 'http'
# получаем список администраторов проекта
ADMINS = [('Support', 'support@djbook.ru'), ]
try:
ADMINS += json.loads(getenv_string('ADMINS', 'raise'))
except:
pass
# получаем доступные хосты
try:
ALLOWED_HOSTS = json.loads(getenv_string('ALLOWED_HOSTS', 'raise'))
except:
ALLOWED_HOSTS = ['*']
И так далее...
Самый полезный момент - работа с базой данных. В данном примере я показываю как указать несколько баз данных и, если одна из баз является PostgreSQL, то подключить к ней расширение PostGIS:
DATABASES = {
'default': dj_database_url.config(
default='sqlite:///db.sqlite3', conn_max_age=600),
'legacy': dj_database_url.config(
default='sqlite:///db.sqlite3', conn_max_age=600, env='DATABASE_URL_LEGACY'),
}
for key, params in DATABASES.items():
if 'postgresql' in params['ENGINE']:
params['ENGINE'] = 'django.contrib.gis.db.backends.postgis'
GDAL_LIBRARY_PATH = getenv_string('GDAL_LIBRARY_PATH', '/usr/lib/libgdal.so')
GEOS_LIBRARY_PATH = getenv_string('GEOS_LIBRARY_PATH', '/usr/lib/libgeos_c.so')
В результате произведённых изменений, в вашем проекте всегда будет только один конфигурационный файл settings.py
. Все различия между серверами DEV/STAGE/PROD и своим рабочим компьютером теперь можно реализовать изменением переменных окружения при запуске проекта.
Например:
export DATABASE_URL=postgres://user:secret@localhost:5432/project
python manage.py runserver