Несколько конфигураций для проекта Django

Несколько конфигураций для проекта 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 репозиторий.

Хостинг для ваших проектов