Django. Настройки под dev и production

Блог / Фреймворк Django

Существует множество вариантов разделения настроек Django под режим разработки. Сейчас вынесу свой вариант. Быть может он встречается где-то еще, я не смотрел. Основным критерием для меня являлось отсутствие лишних наследований на production режиме, возлагая эти нюансы на dev.

Для начала создадим файл devsettings.py рядом с settings.py и запишем в нем одну строчку:

from .settings import *

Таким образом наш новый файл полностью копирует содержимое settings.py. Теперь мы можем определить настройки settings.py под production, а в devsettings.py переопределить их для developer режима.

1. Включаем DEBUG

Основная особенность developer режима - включенный debug. Для этого добавляем в наш файл строчку:

from .settings import *

DEBUG = True

При установленном DEBUG = False в файле settings.py, мы получаем наше основное ответвление между режимами.

2. Отключаем кэширование

Чаще всего в production режиме включено кэширование, Однако, в developer режиме с ним работать невозможно. Для того, чтобы в developer режиме кэширование было отключено, нам надо удалить с переменной MIDDLEWARES нужные компоненты и удалить переменную CACHES.

from .settings import *

DEBUG = True
MIDDLEWARE.remove('django.middleware.cache.UpdateCacheMiddleware')
MIDDLEWARE.remove('django.middleware.cache.FetchFromCacheMiddleware')
del CACHES

Теперь, при запуске в developer режиме кэширование будет отключено.

3. Включение просмотра статики

На production серверах, как правило, django не занимается отдачей статики. Однако, в developer режиме нам не особо нужны дополнительные средства, аля Nginx или Apache, ведь Django в дебаг режиме может отдавать файлы сам. Однако, эта конфигурация на production сервере не нужна. Для этого нам надо переопределить стандартный файл urls.py. Создадим отдельный файл devurls.py рядом с urls.py со следующим содержимым:

from .urls import urlpatterns
from django.conf import settings
from django.conf.urls.static import static

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

То есть, файл devurls.py будет полностью копировать urls.py, но будет расширять его, добавляя в него дополнительные роутинги для отдачи статики. Теперь изменим наш devsettings.py, чтобы он принимал этот файл роутинга:

from .settings import *

DEBUG = True
MIDDLEWARE.remove('django.middleware.cache.UpdateCacheMiddleware')
MIDDLEWARE.remove('django.middleware.cache.FetchFromCacheMiddleware')
del CACHES
ROOT_URLCONF = 'project.devurls'

4. Файл запуска dev

Теперь мы имеем два набора конфигураций для dev и production режимов. Причем, для production режима ничего не поменялось, и он работает напрямую, но dev режим наследует production настройки и расширяет их. Таким образом мы можем дополнять конфигурацию нашего сервера как угодно, и она будет изменяться на обоих режимах.

Осталось только создать среду для запуска dev режима. Для этого создадим файл devmanage.py рядом с manage.py. Скопируем в него содержимое файла manage.py, изменим только инициализацию конфигурации DJANGO_SETTINGS_MODULE с project.settings на project.devsettings.

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.devsettings")
    try:
        from django.core.management import execute_from_command_line
    except ImportError:
        # The above import may fail for some other reason. Ensure that the
        # issue is really that Django is missing to avoid masking other
        # exceptions on Python 2.
        try:
            import django
        except ImportError:
            raise ImportError(
                "Couldn't import Django. Are you sure it's installed and "
                "available on your PYTHONPATH environment variable? Did you "
                "forget to activate a virtual environment?"
            )
        raise
    execute_from_command_line(sys.argv)

5. Запуск django

Теперь у нас есть две отдельные среды под dev и production режимы. Мы можем запуститься в режиме разработки

python devmanage.py runserver

Или в production режиме

python manage.py runserver

Итог

Таким образом, мы ответвили dev режим, который никак не влияет на основной запуск django. Более того, мы имеем два менеджера manage.py и devmanage.py, которые выполняют команды от разных конфигураций. Это будет полезно при использовании django-pipeline, где мы сможем запускать collectstatic разными менеджерами с включенным и выключенным DEBUG. Мы можем тестировать после разработки новой фичи систему в production режиме просто перенабрав консольную команду. Однако, при необходимости изменить конфигурацию нам не надо править ее в двух местах. При изменении конфигурации settings.py и дополняя роутинг в urls.py, все настройки будут применяться в обоих режимах.

Денис Каримов

Django production

Эта запись входит в ряд записей "Django production"

Комментарии
Написать комментарий

Написать комментарий

2017г. Karimov.info