Фёдор Борщёв

Заметки с тегом «Django»

Мои opensource проекты

Я выкладываю в открытом виде на гитхаб почти весь код, который пишу. Большинство — это не opensource в классическом понимании, а скорее открытая разработка, когда любой желающий может увидеть всё, что программисты обычно прячут за кучей НДА. О том, зачем мне это, я уже писал раньше. В этом посте я собрал список таких проектов, рассказав чему в них может научиться джун, пересекающийся со мной по стеку.

Монолитный бекенд школы

Стек: Django REST Framework, celery, pytest, mypy

Это Django, интегрированный с 4 платёжными системами, ОФД, сервисами транзакционнвх и маркетинговых рассылок. Внутри — лучшие практики: тысяча тестов на pytest, все известные мне плагины для flake8, CI/CD на GitHub Actions.

 tough-dev-school/education-backend

Инфраструктура школы

Стек: Ansible, Docker Swarm, PostgreSQL, MongoDB, RabbitMQ, Redis

Большой плейбук на Ansible. Внутри — 6 сервисов: бекенды, фронтенды, БД, бекапы, Metabase. Пишет логи в papertrail, создает анонимизированные дампы БД и делает еще кучу хороших практик.

 tough-dev-school/infrastructure

Наши бойлерплейты

Стек: Django/vue.js(nuxt)

Когда в «Феде и Самате» мы начинаем новые проекты, мы используем готовые и преднастроенные репозитории — для django и nuxt. Это экономит время на настройке линтеров, добавлении библиотек вроде pytest или jest, нужных на всех проектах.

 fandsdev/django,  fandsdev/nuxt-boilerplate,

Утилитарные докер-образы

Набор образов, которые помогают удобнее поддерживать небольшой продакшен на docker swarm:

  • Бекапы для  PostgreSQL или  рандомных файлов. Служат, чтобы можно было добавлением одного сервиса настроить минимальный бекап. Работают с S3 (я советую Backblaze) и healthchecks.io для мониторинга.
  •  periodic-docker-prune. Очищает кеш докера от неиспользуемых образов. Нужен, чтобы не кончалось место, если часто деплоите большие и разные образы.
  •  adhoc-proxy. Помогает пробросить доступ снаружи в закрытые сети. К примеру, если у вас RabbitMQ живёт в DMZ, с его помощью можно безопасно организовать доступ к management-интерфейсу.
  •  robots-txt-proxy. Позволяет с помощью докера делать два файла robots.txt — чтобы ни один инстанс вашего приложения, кроме продакшена, не индексировался поисковиками.

selfmailbot

Стек: python-telegram-bot, celery

Телеграм-бот для GTD-гиков вроде меня: пересылает сообщения из телеграма на почту, чтобы не терять и разбирать всё, что вам пишут. Подробности тут.

 f213/selfmailbot

Дотфайлы

Мои дотфайлы для macos. Внутри fish, neovim, karabiner, и полный список софта, который я юзаю в виде роли Ansible. Сделано на dotbot.

 f213/dotfiles

Антиспам для комментариев в телеграме

Стек: python-telegram-bot, Amazon Rekognition

В 2021 году в комментах к моему каналу появилось много спамеров. Я разобрал все паттерны их поведения и написал бота, который удаляет сообщения. Идея простая — если лишить спамеров возможности увести пользователя на свой канал или страницу — спалить станет не за чем. Так, у меня в канале нельзя постить ссылки на веб или телеграмм, писать не от своего имени.

 f213/channel-discussion-antispam-bot

Telegram → RSS

Стек: Python, Scrapy

Делает RSS-ленту из моего канала в телеге. Легко переделать под любой другой канал.

 f213/tg2rss

Как выучить любой язык программирования

Если вы только собираетесь войти в ИТ, и выбираете куда пойти учиться и какой курс купить, вот вам краткая инструкция:

  1. Покупаете хорошую книгу по выбранному языку программирования. «Хорошая» означает, что её кто-нибудь кому-нибудь советовал в группах/форумах больше 5 раз. К примеру по питону это Марк Лутц — «Изучаем питон».
  2. Изучаете её всю, от корки до корки, делая все домашние задания.
  3. Выбираете самый популярный фреймворк. «Самый популярный» означает «чаще всего упоминается на тематических сайтах». В питоне под веб это Django.
  4. Изучаете всю официальную документацию к фреймворку, от корки до корки. Проходите официальные обучалки. Гугите <framework> best practices, изучаете их.
  5. Делаете свой пет-проект. Блог, сайт, исследование аномалий в парковке под окном, что угодно — зависит от выбранного языка.
  6. Ищете команду с высокой инженерной культурой, которая возьмёт вас джуниором. Дальше учитесь у них.
  7. На сэкономленные на курсе деньги езжайте на недельку или две в Питер (если живёте в Питере — в Калининград).

И не благодарите.

Как переименовать приложение в Django

Как-то в бекенде школы меня перестало устраивать название приложения в Django. Всё просто — когда я начинал проект, я продавал только курсы, и приложение с моделями курсов называлось courses. Потом появились записи этих курсов (record) и наборы (bundles). Конечно мне захотелось переименовать приложение courses в products, чтобы уменьшить когнитивную нагрузку при чтении кода.

К сожалению, я не нашёл ни одного решения, кроме стрёмного django-rename-app, который предлагал мне выполнять management-команды в консольке на проде. Кроме того, что это ломает любые пайплайны CI\CD, там ещё и код был не очень понятный. Так что в итоге я решил сделать это сам. Оказалось сложно, поэтому я написал эту инструкцию.

Исходные условия:

  • CI\CD пайплайн, который запускает миграции при каждом деплое.
  • Данные терять нельзя.
  • Мы не стесняемся править старые миграции.

Все изменения я делал на живом проекте, так что примеры будем брать прямо из пулл-реквестов.

  • Подменяем имя приложения в истории миграций: ./manage.py makemigrations <some-other-app> -n RenameOldApp --empty. Коммит.
  • Деплоим миграцию на прод. После этого шага ничего нельзя деплоить до конца.
  • Делаем новый пулл-реквест.
  • Переименовываем папку с приложением: git mv courses products
  • Заменяем все упоминания старого приложения в миграциях. Коммит.
  • У всех моделей в новом приложения в Meta прописываем db_table с именем старого приложения. В моём случае, если модель называется bundle и лежала в приложении courses, нужно прописать db_table = 'courses_bundle'. Коммит.
  • В старых миграциях, которые используют операцию CreateTable, добавляем новую db_table в options. Коммит.
  • Меняем упоминания приложения в коде, можно автозаменой. Коммит.
  • Проверяем, ./manage.py makemigrations --check. Новых автоматических миграцией был не должно, ошибок тоже.
  • Деплоим на прод.

В итоге у нас получается два деплоя. Первый подменяет миграции, а второй — код. В результате модели будут лежать по новому адресу, но ходить в старые таблицы. Для меня это было плюсом, т.к. не пришлось переделывать аналитические SQL-запросы, которые ходят в базу из Metabase.

Почему я открыто делюсь исходным кодом (и +2 открытых проекта на Django)

Разработчики, которые приходят на мои проекты, часто удивляются, почему я с такой лёгкостью открываю свои наработки — добавляю в репозитории в гитхабе, даю доступ на сервера и передаю документацию. Ведь обычно все прячут исходный код за семью печатями — не делятся доступами, присылают странные zip-архивы без папки .git и т.д. Я где-то даже видел команду, которая обфусцировала код, прежде чем выложить на гитхаб.

Я так делаю потому, что у меня есть большая цель (только не смейтесь) — я хочу, чтобы как можно больше программистов радовались своей работе. Если программисты не просто делают свою работу, а радуются — они работают гораздо быстрее. Если бы все программисты в мире работали быстрее — многое поменялось бы для человечества в целом: быстрее бы появлялись и умирали новые стартапы, проверялось бы больше гипотез, а значит росло бы количество цифровых продуктов. Представляете, сколько та же яндекс-лавка сэкономила москвичам времени на походах в магазин? А если бы нас посадили на карантин в 2015 году, когда её не было? А ведь уже тогда были доступны все технологии, на которых она работает. Уверен, даже идеи были. Надо было только напрогать.

К сожалению, счастье на работе — не очень измеримая штука. Для кого-то счастье — это короткий рабочий день и полдники, для кого-то — ощущение причастности к общему делу, для третьего — социальная значимость проекта. Нет какой-то одной штуки, которая приносит счастье всем без исключения.

Зато я знаю штуку, которая у всех без исключения забирает счастье — это говнокод. Невозможно быть счастливым и работать быстро, когда тебе надо ковыряться в череде из десяти вложенных if, написанных тремя разными аутсорсерами, которые торопились уйти в отпуск.

К сожалению, я видел очень мало команд, которые следят за производительностью, как за функцией от счастья, а за счастьем — как за функцией от инженерной культуры. Как могу, я это исправляю — помимо прямо консультирования, я пишу сюда, стремлю лайв-кодинг, выступаю и устраиваю вебинары. Всё это не для пресловутого «личного бренда», а потому что это — моя цель.

На прошлой неделе я открыл два важных проекта на Django:

education-backend: это активный коммерческий проект — бекенд, которым я пользуюсь чтобы брать деньги вебинары.

f213/django — мой стартер проектов на django с батарейками: pytest, 12-факторностью, кучей линтеров и ещё много чем.

Первый проект можно использовать как справочник — так, на мой взгляд, должен выглядеть коммерческий код, который написали быстро и с жёсткими дедлайнами. Второй — полезная утилита. Просто заюзайте её, когда начнёте следующий проект, это сэкономит вам десяток часов.

Я надеюсь, что мои исходники послужат кому-то примером того, что можно писать коммерческий код для удовольствия.

Если вам нравится, что я делаю, меня легко отблагодарить — посоветуйте друзьям мой блог, поставьте звёзду на гитхабе или поддержите мою деятельность на патреоне.