Несколько конфигураций для проекта Django
По умолчанию в Джанго все настройки проекта собраны в одном файле settings.py, что не очень удобно. Например хочется разделить конфигурации для разработки и прода, а так же хранить секретные данные (типа данных подключения к БД) в отдельном файле, чтобы он не попадал в Git репозиторий.
Для Django существуют готовые пакеты для управления конфигурацией, например django-split-settings (https://github.com/wemake-services/django-split-settings), но я делаю все необходимое вручную. Ниже покажу как.
Обращу ваше внимание, это не самый лучший и правильный способ разделения конфигураций проекта на Джанго, это один из вариантов, который удобен мне.
Итак, например мы создали проект с именем myproject, то соответственно все настройки проекта хранятся в файле myproject/settings.py.
Чтобы разделить конфигурации я создаю папку settings в той же директории что и файл settings.py, добавляю туда файл __init__.py в котором содержится всего одна строка:
from local_settings import *
После перемещаю в папку settings существующий файл settings.py и переименовываю его в base.py. В этом файле буду хранится настройки общие для всех окружений. Только сделаем в нем одно изменение, заменим строку где определяется BASE_DIR на:
BASE_DIR=Path(__file__).resolve().parent.parent.parent #в конце добавлен .parent
Так же создадим файлы dev.py и prod.py в них будут отдельно хранится настройки для разработки и продакшена. Далее в корне проекта (там где лежит manage.py) создадим файл local_settings.py в нем будут хранится разные ключи и пароли, поэтому этот файл нужно обязательно добавить в gitignore.
У нас получается такая структура:
├─ myproject/
│ ├─ settings/
│ │ ├─ __init__.py
│ │ ├─ base.py
│ │ ├─ dev.py
│ │ └─ prod.py
│ ├─ __init__.py
│ └─ asgi.py
│ ├─ urls.py
│ └─ wsgi.py
├─ local_settings.py
└─ manage.py
Дальше изменим файл dev.py, добавим туда то, что понадобится нам для разработки. Например debug_toolbar:
from .base import *
DEBUG = True
ALLOWED_HOSTS = ['*']
INSTALLED_APPS = INSTALLED_APPS + ['debug_toolbar']
MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware'] + MIDDLEWARE
А в файле prod.py отключим режим отладки:
from .base import *
DEBUG = False
ALLOWED_HOSTS = ['myproject.ru']
В файл local_settings.py можно перенести, для примера, SECRET_KEY и настройки подключения к БД:
from myproject.settings.dev import *
SECRET_KEY = 'django-insecure-r1zlq1!6k3s2…'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
В первой строчке мы указали какую конфигурацию мы хотим импортировать, если мы заходим импортировать нашу prod конфигурацию, нужно будет заменить первую строку на:
from myprojec.settings.prod import *
Готово, можно протестировать запустив сервер python manage.py runserver
Только не забудьте добавить в gitignore файл local_settings.py. Чтобы не забывать какая информация должна быть в нем, я просто создаю файл шаблон local_settings.example с шаблоном этого файла:
# Тут выбираем настройки для какого окружения нам нужны
from config.settings.prod import *
SECRET_KEY = 'секретный ключ'
DATABASES = {Настройки подключения к БД}
И уже этот файл добавляю в Git репозиторий.