Удобные настройки в Django

anderson |
В процессе создания проекта мы постоянно пополняем файл настроек (settings.py) различными константами нашего проекта, настройками сторонних библиотек, а так же специфическими настройками сервера разработки и продакшена. В результате settings.py становится просто громадным и трудно читаемым.

В этой статье я расскажу вам, как разбить настройки проекта на несколько мелких файлов, используя маленькие хитрости питона.

Хитрость заключается в том, чтобы превратить наши настройки в библиотеку и подключить все нужные файлы через __init__.py.

Итак, создаём в корневой папке проекта директорию settings, вовнутрь кладём наш ещё девственно чистый settings.py под именем __init__.py, содержащий только настройки самой джанги. Далее в самом низу, делаем импорт дополнительных файлов.

Для примера возьмём библиотеку django-compress, создадим для неё файл settings/compress.py, затем в settings/__init__.py сделаем следующий импорт

from .compress import *

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

Вот так например выглядит настройки проекта pyplanet

(venv)[offline@laptop python]$ ll settings/
total 36K
-rw-r--r-- 1 offline offline  286 May 15 11:22 bbmarkup.py
-rw-r--r-- 1 offline offline 3.7K May 25 15:22 compress.py
-rw-r--r-- 1 offline offline 5.1K May 27 08:17 __init__.py
-rw-r--r-- 1 offline offline 1.3K May 18 14:21 local.py
-rw-r--r-- 1 offline offline 1.6K May 13 13:28 publicauth.py
-rw-r--r-- 1 offline offline  189 Apr 21 17:51 sape.py
-rw-r--r-- 1 offline offline  125 Apr 26 17:20 simplepagination.py
-rw-r--r-- 1 offline offline   28 May 27 08:17 tagging.py

Если вы использовали динамическое определение папки проекта и от неё задавали MEDIA_ROOT и TEMPLATE_DIRS в стиле

PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))

то теперь вам нужно будет изменить это на

PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

Других изменений в проекте не потребуется.
Теги: Share
Комментарии (4)
skullpoochie #
Я когда-то пытался сделать все настройки в отдельной директории, но столкнулся с проблемами в пространстве имен. По-моему, __init__.py решает эту проблему. Спасибо :)
0
rastler #
Для продакшен версии конечно хорошобы перенести часть параметров в административный интерфейс
0
myfreeweb #
Большое кол-во файлов не нужно. Я выношу DATABASES и DEBUG в localsettings.py, делаю bzr ignore localsettings.py, создаю на сервере свой localsettings с др. настройками.
0
anderson #
я тоже делал так несколько лет, теперь вот перешёл на новый способ. У меня просто файлы настроек очень большие, особенно от django-compress, в котором сотни записей.
0
hash #
Подход интересный, и может найти своих последователей. Со своей точки зрения, плодить кучу дополнительных установок не очень хорошая идея, а просто бесполезная.