- PVSM.RU - https://www.pvsm.ru -

Rick and Morty ©. Чувак презентует батарейку, я тоже.
Не так давно я опубликовал небольшое приложение [1] для формирования «панелей управления» django-проектов. В процессе разработки столкнулся с банальной ситуацией хранения дефолтных настроек модуля. Скорый поиск по гитхабу дал понять, что каждый разработчик использует свою реализацию. Существуют также готовые решения, однако, мне они показались избыточными в таком простом вопросе, поэтому я поступил мудро и запилил свой велосипед.
Может показаться, что данная батарейка будет полезна только OSP-шникам, но штука в том, что эту же самую идею можно использовать в повседневной жизни.
Допустим, вы написали свое приложение, которое что-то там делает. При этом, есть возможность в settings.py проекта выставить какие-то значения, которые перепишут те, что идут из коробки. Итого вся задача сводится к двум вещам: хранить значения по-умолчанию и дать разработчику-потребителю их переписать в своем файле настроек.
Типа так:
# Дефолтное значение в app/my_settings.py
FOO = True
# Вы ставите в settings.py
FOO = False
# В итоге, переписалось
from django.conf import settings
settings.FOO
False
Сейчас уже привычно разрабатывать проект модульно разбивая его на "приложения". Практически все вынесено в индивидуальные файлы аппы: models, views, urls… кроме settings. Например, вы пишете адаптер к сервису рассылок и следующий код в каком-нибудь newsletters/adapter.py:
adapter = Adapter(username='user', password='pass')
Вы будете правы, если скажете, что хардкодить логин и пароль глупо и их надо вынести в константы:
USERNAME = 'user'
PASSWORD = 'password'
adapter = Adapter(username=USERNAME, password=PASSWORD)
Вроде бы близко, но все равно не то. Еще подход:
# settings.py
NEWSLETTERS_USERNAME = 'user'
NEWSLETTERS_PASSWORD = 'password'
# newsletters/adapter.py
from django.conf import settings
adapter = Adapter(username=settings.NEWSLETTERS_USERNAME, password=settings.NEWSLETTERS_PASSWORD)
Похоже на правду. Однако есть несколько "но":
NEWSLETTERS_ не очень удобно. Во-первых, просто больше повторяющихся букв в коде; во-вторых, значения могут быть более универсальным и использоваться чаще, от чего эта причина становится все печальнееПопробуем сделать так:
# newsletters/conf.py
from pkgconf import Conf
class NewsLetters(Conf):
USERNAME = 'username'
PASSWORD = 'password'
# newsletters/adapter.py
from . import conf
adapter = Adapter(username=conf.USERNAME, password=conf.PASSWORD)
Условия выполнены: нет префикса, нет захламления файла настроек проекта.
Переопределим значения в Dev настройках*:
# local_settings.py
NEWSLETTERS_USERNAME = 'test_user'
Готово. Это перепишет значение USERNAME для конфигурации приложения newsletters, а значение PASSWORD останется прежним, потому что мы его не меняли. В результате получаем аккуратный и стройный settings.py, где лежат всякие там DATABASES, TEMPLATES и т.д., только то, что относится к проекту.
Тесты проводились на python 2.7.9, 3.4.3, 3.5.0 и django 1.8, 1.9.
Name Stmts Miss Cover
-----------------------------------------
pkgconf/__init__.py 22 0 100%
Проект на гитхабе [2].
* Пожалуйста, не делайте так, используйте django-configurations [3].
Автор: magic4x
Источник [4]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/django-2/120526
Ссылки в тексте:
[1] приложение: https://www.pvsm.ru/post/278743/
[2] гитхабе: https://github.com/byashimov
[3] django-configurations: https://github.com/jazzband/django-configurations
[4] Источник: https://habrahabr.ru/post/283378/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.