На Хабре любят истории про эффективность. Но есть одна тема, которую обычно обходят стороной — ритуалы джанго-разработчиков.
Эти ритуалы жрут месяцы жизни компаний, и об этом мало кто говорит.
Я расскажу историю. Она звучит как анекдот, но на самом деле это кейс.

История Васи и Пети
В компании «Рога и Продакшн» решили запустить новый сервис.
Назначили двух разработчиков:
Вася — senior Django-разработчик.
Петя — middle, но с django-cfg.
Вася: путь традиции
Первые три дня он копировал старый
settings.py.Потом неделю правил
INSTALLED_APPS.Потом два дня воевал с
ALLOWED_HOSTS.Потом переписывал
DATABASESпод дев, тест и прод.Потом поймал баг, потому что написал
DEBUG="yes".Потом завёл
.envи сказал, что «всё по best practices».
К концу месяца Вася гордо показал: «проект готов к написанию бизнес-логики».
Петя: путь революции
Написал конфиг в 10 строк через django-cfg.
Запустил сервис на следующий день.
На третий день уже писал бизнес-логику.
Через неделю показал работающий релиз.
Счёт компании
Ставка разработчика — $4000/мес.
Вася потратил 1,5 месяца на конфиги → $6000.
Петя сделал то же за 1 день → $200.
Разница: $5800 в мусорное ведро только из-за того, что Вася верил в магию settings.py.
В чём суть django-cfg?
Типизированные конфиги на Pydantic (никаких «строка вместо bool»).
Готовые пресеты для DRF, Spectacular и прочего.
Зоны API: public, admin, internal — настраиваются декларативно.
Автогенерация Python + TypeScript клиентов с авторизацией и токенами.
Ноль копипаста: один файл → всё готово.
А теперь вопрос для работодателей
Когда вы видите строку в бюджете «1,5 месяца на подготовку окружения»,
вы думаете, что это реальная работа?
Нет. Это Вася-джанго-разработчик обосновывает своё существование.
А Петя уже сделал продукт.
Потому что django-cfg убирает то, на чём они десятилетиями строили иллюзию «сложной инженерной работы».
Ритуалы исчезают. Остаётся продукт.
А продукт видно директору.
Заключение
Каждая компания выбирает:
Либо оплачивать шаманство с
settings.py.Либо делать проекты быстро и прозрачно.
Комментарии (0)

andreymal
14.09.2025 10:07Первые три дня он копировал старый
settings.py.Все базовые параметры лежат готовые в репозитории/шаблоне, а для локального окружения он скопировал
local_settings.example.pyвlocal_settings.pyПотом неделю правил
INSTALLED_APPS.Он лежит готовый в репозитории/шаблоне
Потом два дня воевал с
ALLOWED_HOSTS.В вышеупомянутом
local_settings.example.pyуже прописано всё готовое для локалхостаПотом переписывал
DATABASESпод дев, тест и прод.Тест лежит готовый в репозитории/шаблоне, прод лежит готовый у админов (и простой разработчик не должен иметь доступ к проду), дев лежит готовый в
local_settings.example.py, разве что пароль свой вписать если он естьПотом поймал баг, потому что написал
DEBUG="yes".Не поймал, потому что django-stubs сразу подсветил ошибку
Потом завёл
.envи сказал, что «всё по best practices».Не завёл, потому что с
local_settings.pyтоже живётся хорошоПодробнее: Как сделать несколько конфигураций (settings.py) для проекта Django?
Итого:
если мы дорабатываем существующий проект: минута на git clone, минута на создание
local_settings.py, ну может ещё пара минут на apt install mysql — $1.25 на всё про всёесли мы делаем новый проект: просто скопировать всё вышеупомянутое из любого существующего проекта или сгенерировать из заранее подготовленного шаблона — пусть условно ещё $1.25
Продать django-cfg для меня у вас не получилось

markolofsen Автор
14.09.2025 10:07ну так не было такой задачи)

markolofsen Автор
14.09.2025 10:07Да, да, конечно, копипастить из local_settings.py — это инновация уровня Илона Маска)))))

ktori
14.09.2025 10:07Абсурдная рекламная статья про ии-сгенерированную библиотеку с миллионом зависимостей и непонятным набором функций, с ии-сгенерированной КДПВ. Как связан текст статьи про settings.py с библиотекой которая интегрируется с телеграмом, ллмками, получением курса валют из ЦБ РФ и ЕЦБ и всеми остальными идеями возникшими в агонии безымянной видеокарты из кластера где-то в душном датацентре?

markolofsen Автор
14.09.2025 10:07То есть твой settings.py с копипастой из десятка туториалов - это зрелость, а библиотека с готовыми интеграциями это "миллион зависимостей" ?
Красиво оправдывать болото умеешь!)

soymiguel
14.09.2025 10:07А если написать, что Вася потратил полтора гугильона пупильонов денег и 3 тыщи лет на INSTALLED_APPS, то станет еще драматичнее.
Правда, убедительно это звучало бы от лица Саши Пряникова, евпочя.

mrAsh4r
14.09.2025 10:07Увидя название статьи, подумал будет статья о безопасности, о грамотной настройке settings.py и защите данных.
Но не тут то было, статья о вообще другом, о рекламе своего продукта, который по большей части сделан нейронками, и обещает сэкономить миллионы на продакшене, на энтепрайзе (раз у нас сравнение сеньора и мидла). Немного пораскинув мозгами, выходит так что скупой платит дважды, и если мы сэкономим на нормальной настройке, то вот что нас ждёт:
(Раз проект делала нейронка и скорее всего статью тоже, то грех не воспользоваться ею для беглого анализа проекта)
Этот пакет нельзя использовать в продакшене, потому что:
Это не «конфиг-хелпер», а громоздкий комбайн: внутри 190+ файлов, десятки модулей (accounts, api/commands, middleware, leads, telegram, currency, llm и пр.), что резко увеличивает поверхность атаки и риски цепочки поставки.
Устанавливает консольный скрипт django-cfg с широкими полномочиями (entry_points), что добавляет необязательные точки выполнения кода во всей системе.
В исходниках есть прямые вызовы subprocess из веб- и management-контекста, что при конфигурационных ошибках может привести к удалённому выполнению команд.
Много сетевых вызовов (requests/telebot) в core, middleware и модулях — потенциальные каналы эксфиляции и зависимость от внешних сервисов без прозрачного аудита.
Публичный репозиторий и документация нестабильны/недоступны (часто 404), что делает аудит и доверие к обновлениям невозможными.
Обещания «магии» в виде автоконфигов противоречат лучшим практикам Django: минимальная магия, явные настройки через окружение/конфиги и ограниченные зависимости.
Рекомендация: отказаться от пакета; использовать стандартные настройки Django или зрелую альтернативу django-configurations (Jazzband) с минимальными зависимостями и прозрачной историей.

mrAsh4r
14.09.2025 10:07И это ведь я ещё не изучил сам исходный код проекта и каждого импорта (кой их 30+ загружается вместе с django-cfg).
На мой взгляд это выглядит как попытка supply-chain атаки. Особенно если учесть названия проектов, которые созвучны с полноценными, известными проектами. (pydantic2 чего стоит, или аналогия ТС на django-configurations)

markolofsen Автор
14.09.2025 10:07После твоего коммента ясно, кто тут настоящий Вася. Паника про "190+ файлов", "subprocess" и "supply-chain атаки" без единого взгляда на код - это уровень джуниора, который видит Django впервые.
Репо недоступно? Да скачай PyPI пакет и посмотри реальный код, а не придумывай страшилки по README. Весь функционал это набор опциональных модулей и CLI-инструментов, которые не выполняются сами по себе в продакшене. Никаких "эксфильтраций", никаких "рисков цепочки поставки" - это твои страхи, а не факты.
Выдавать "не использовать в проде" на основании домыслов? - чистый middle-tier уровень. Senior сначала смотрит код, потом делает выводы, а не пугает всех страшными словами.
Короче, прежде чем раздавать советы про безопасность и архитектуру - сначала открой пакет, пойми, что делает каждая строчка, и только потом делай выводы. Всё остальное - трёп, чтобы казаться экспертом.

mrAsh4r
14.09.2025 10:07Слушай, я может и не шарю, но твоя статья же по сути про то, что "зачем платить сеньору, если можно мидла с cfg взять".
Ты мне сам пишешь, что я — мидл, потому что "не использовать в проде".
Тогда выходит, что твой тул для мидлов, а мидлы его и не берут.
Это как-то грустный замкнутый круг получается: софт для тех, кто им пользоваться не станет.

markolofsen Автор
14.09.2025 10:07По фактам:
проект открыт, код доступен, всё можно проверить руками. Если твоя уверенность держится только на предположениях - это не экспертиза, это воображение.
А вот в реальном продакшене решают не страшные слова, а рабочие инструменты. И тут всё просто - кто умеет, тот проверяет и использует. Кто не умеет - тот пишет, что "мидлы не возьмут".
Замкнутый круг, да :)

danilovmy
14.09.2025 10:07Нет никакого замкнутого круга. Кто может - идет на djangoproject, кто может - гуглит. Я не буду против, если усилиями хабра еще и в общедоступных LLM-ках останется пометка, что пакеты, где засветился unrealos.com, не надо устанавливать.
проект открыт, код доступен, всё можно проверить руками.
https://github.com/markolofsen/django-cfg - 15.09.2025 20:28 выдает 404. Проект не открыт, код проекта не доступен.
https://pypi.org/project/django-cfg/ - пакет доступен для установки. После установки в >100 mgb возможно исследовать код установленного пакета.
Моя уверенность держится на понимании, как работает open-source: на 15.09.2025 django-cfg - НЕ osp.

kez
14.09.2025 10:07проект открыт, код доступен, всё можно проверить руками.
кажется это не совсем так, зато можно пораздоваться что проект открыт к изменениям со стороны сообщества
We welcome contributions! Here's how to get started:
git clone https://github.com/markolofsen/django-cfg.gitупс
~/tmp $ git clone https://github.com/markolofsen/django-cfg.git Cloning into 'django-cfg'... Username for 'https://github.com':бывает, мне тоже иногда лень читать что там чатгпт нагенерил

danilovmy
14.09.2025 10:07Читаю и думаю, где-то я это уже видел. И точно! Это тот же автор, что обещал революцию в Django, но что-то пошло не так и революции не случилось.
Вот и тут. Опустим стиль изложения, и ответы автора на комментарии и погрузимся в работу пакета. Непонятно, почему репозиторий закрыт, потому работаем с версией, что получена с PyPy. И это настолько плохо, что даже
хорошоплохо. Абсолютно согласен с @mrAsh4r - пакет не стоит ставить ни в каком случае. Даже автору ( @markolofsen) я бы порекомендовал это не ставить:Задача управлять файлом, который не требует тестов, потому, что там нет кода, а только объявление констант - провалена. Написано столько кода, что чисто статиcтически (по хальстеду) получаем 100% наличие ошибок.
Задача управлять файлом без зависимостей от других библиотек, которая решается посредством дополнительной установки 91! библиотеки (я душнила, я посчитал) - это проваленная задача.
Задача понять как работают классы LazySettings, SettingsReference и UserSettingsHolder провалена, поскольку автор изобрел свои классы, дублирующие существующий функционал, только которые делают это хуже, чем оригинал.
Задача управлять одним файлом размером на 13kb при помощи библиотеки в 399 файлов в 109 папках с весом 3mgb, это даже не провал. Это просто п*3*eц какой-то.
Я не буду вдаваться в код который я нашел внутри django-cfg, потому, как вежливость призывает меня не использовать только бранные слова в описании увиденного.
Серьезно, если это реально авторский код, написанный человеком... то так это не решается. Ну или я чего-то глобально не понимаю.

markolofsen Автор
14.09.2025 10:07Слушай, похоже, ты пока не совсем понимаешь, что за пакет. Паника про "399 файлов" и "3MB" без взгляда на реальный код выглядит как догадки, а не анализ ;-)
Лучше скачай пакет, посмотри, как всё устроено, и только потом делай выводы - иначе это просто домыслы.

danilovmy
14.09.2025 10:07Я посмотрел код еще до того как написать свой комментарий. Тебе надо пример? Смотрел там, где интересно решить мои задачи. Не всю шнягу, что прилетела из PYPY.
Апп support с Ticket/Message.
используете uuid. Зачем created_at если uuid содержит дату создания.
Зачем сортировка по created_at, если она и так уже по uuid сортирована.
Некешированное Поле last_message модели ticket выполняет запрос к базе. В админке вы используете значение поля дважды на list view. При 100 тикетах в admin-list это автоматически 1 + 200 запросов.
Некоторые места вообще непонятны, простой пример:
try: from django_revolution import add_revolution_urls ... except ImportError: # Django Revolution not available - skip passdjango_revolution в dependency. Ставится автоматически. С какой целью тут стоит эта проверка?
То, что я написал, это два места в 400 файлов. Могу больше, но зачем?

markolofsen Автор
14.09.2025 10:07Слушай, у тебя прямо страсть искать изъяны в каждой строчке
Но по сути: uuid и created_at - разные сущности, их дублирование встречается в массе production-проектов, это норма. Но откуда тебе об этом знать?
А N+1 в админке да, бывает, решается элементарно и явно не тянет на "ой, все пропало".
Про try/except для django revolution - да это классический fallback, тут вообще придраться сложно. Но у тебя получилось, удивительно.
То есть ты описал не баги уровня "не ставить ни в коем случае" а обычные рабочие моменты, которые в любом реальном проекте решаются за час правками =) Странные у тебя выводы короче бро. Ну просто не твой продукт, пользуйся ванилой)
kez
14.09.2025 10:07сейчас никому не нужны сгенеренные нейронкой пакеты, и в этом основная претензия людей — статья с очень громким заголовком, в теле которой есть ссылка на созданный автором пакет, и смысл которой был в "создании дискуссии"
нет предмета дискуссии, банально нечего обсуждать

KonstantinTokar
14.09.2025 10:07Всё-таки почему на гитхабе 404? Нк предположим, Вы сделали шедевр. Стандартная практика - код на гитхабе, issue, pull request, и т.д. - а сейчас что то не работает, Вы не отвечаете, все делают патчи в своих копиях?

markolofsen Автор
14.09.2025 10:07Просто подготавливаемся, заметили что неправильно документация организована была. Поэтому сделали для удобства
django-cfg create-project "My Awesome Project"
Скоро откроем на гитхабе, документацию готовим подробную.
kez
14.09.2025 10:07Раз уж это случайность, что репозиторий закрыт, стоит ли ожидать остальные проекты в открытом доступе? pydantic2, pydantic3 и другие
whoisking
Успей скачать, только сегодня!
P.S. , чёто у вас гитхаб 404 и странные пакеты на pypi, напр. "pydantic2"
markolofsen Автор
как-то сам себе противоречишь))) если бы "успей скачать сегодня", то гитхаб был бы открыт. Это скорее пост к размышлению