Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DRF и моток синей изоленты

DRF и моток синей изоленты

Сергей Буткин (ООО БестДоктор, ведущий разработчик серверных приложений) @ Moscow Python №77

"Все иногда пишут на Django Rest Framework, я расскажу про наш опыт костылестроения и улучшайзинга".

Видео: https://moscowpython.ru/meetup/77/drf-and-isolenta/

Moscow Python Meetup
PRO

June 09, 2022
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. Django и моток синей изоленты v2022 Буткин Сергей Архитектор ПО

  2. BestDoctor и Django • DRF + RestDoctor — гнем, где

    не гнется и наоборот
  3. BestDoctor и Django • DRF + RestDoctor — гнем, где

    не гнется и наоборот • Arch Guide — делим ответственность по слоям
  4. BestDoctor и Django • DRF + RestDoctor — гнем, где

    не гнется и наоборот • Arch Guide — делим ответственность по слоям • FieldTracker — знаем, что поменялось у модели
  5. BestDoctor и Django • DRF + RestDoctor — гнем, где

    не гнется и наоборот • Arch Guide — делим ответственность по слоям • FieldTracker — знаем, что поменялось у модели • Обогащаем контекст транзакции для CDC
  6. BestDoctor и Django • DRF + RestDoctor — гнем, где

    не гнется и наоборот • Arch Guide — делим ответственность по слоям • FieldTracker — знаем, что поменялось у модели • Обогащаем контекст транзакции для CDC • PGView — когда аннотаций не хватает
  7. BestDoctor и Django • DRF + RestDoctor — гнем, где

    не гнется и наоборот • Arch Guide — делим ответственность по слоям • FieldTracker — знаем, что поменялось у модели • Обогащаем контекст транзакции для CDC • PGView — когда аннотаций не хватает • STORAGES — подключаем несколько хранилищ в стиле Django
  8. RestDoctor • API пользуются разные люди и хотят они сильно

    разного
  9. RestDoctor • API пользуются разные люди и хотят они сильно

    разного • Форматы (common:1, common:2) зашли мобильной разработке
  10. RestDoctor • API пользуются разные люди и хотят они сильно

    разного • Форматы (common:1, common:2) зашли мобильной разработке • Ресурсы (ролевое версионирование) зашли не очень
  11. RestDoctor • API пользуются разные люди и хотят они сильно

    разного • Форматы (common:1, common:2) зашли мобильной разработке • Ресурсы (ролевое версионирование) зашли не очень • К oneOf в схеме готовы немногие (тулинг, валидаторы, кодогенераторы)
  12. RestDoctor • API пользуются разные люди и хотят они сильно

    разного • Форматы (common:1, common:2) зашли мобильной разработке • Ресурсы (ролевое версионирование) зашли не очень • К oneOf в схеме готовы немногие (тулинг, валидаторы, кодогенераторы) • Pydantic-сериализаторы лаконичны и удобны
  13. RestDoctor • API пользуются разные люди и хотят они сильно

    разного • Форматы (common:1, common:2) зашли мобильной разработке • Ресурсы (ролевое версионирование) зашли не очень • К oneOf в схеме готовы немногие (тулинг, валидаторы, кодогенераторы) • Pydantic-сериализаторы лаконичны и удобны • Есть претензии к ModelViewSet миксинам
  14. Django • Ridiculously fast, Reassuringly secure и Exceedingly scalable

  15. Django • Ridiculously fast, Reassuringly secure и Exceedingly scalable •

    Можно достаточно быстро начать … • … быстро вырасти
  16. Django • Ridiculously fast, Reassuringly secure и Exceedingly scalable •

    Можно достаточно быстро начать … • … быстро вырасти • … и легко накопить техдолг
  17. Django • Ridiculously fast, Reassuringly secure и Exceedingly scalable •

    Можно достаточно быстро начать … • … быстро вырасти • … и легко накопить техдолг Владимир Филонов. Тени прошлого: разбираемся, как бороться с legacy https://www.youtube.com/watch?v=1-Dis1hX7r0
  18. Зачем выносить бизнес логику? • Тестируем не логику, а фикстуры?

    — FactoryBoy • Тестируем не логику, а фреймворк? — client.get(‘/endpoint’) • Декомпозиция и снижение сложности • Unit-тесты легко и просто на mock’ах
  19. Two scoops of Django • Fat Models, Utility Modules, Thin

    Views, Stupid Templates • Смешивают бизнес логику и доступ к данным
  20. Two scoops of Django • Fat Models, Utility Modules, Thin

    Views, Stupid Templates • Смешивают бизнес логику и доступ к данным • Services из HackSoftware Styleguide как альтернатива
  21. Two scoops of Django “In his design, James overtly rewrites

    common patterns for Django. While it appears to work for him, it makes for a harder-to-maintain project in that any new developer on the project has to learn a new paradigm. The charm of Django is heavily based on convention over configuration, and his design explicitly breaks it.”
  22. А что там с DRF • ModelViewSet.get_queryset() • ModelSerializer.save() •

    Не можем отдать одинаковый ответ на list/retrieve и create/update class AuthorViewSet(ModelViewSet): queryset = Author.objects.annotate(books_count=Count(‘books’)) serializer_class = AuthorWithCountSerializer def get_serializer_class(self): …
  23. А что там с DRF • Валидация может сходить в

    базу • И это никак нельзя отразить в схеме API class BookCreateSerializer(ModelSerializer): class Meta: model = Book fields = [‘title’, ‘author’] author = SlugRelatedField( slug_field=’uuid’, queryset = Author.objects.all() )
  24. BestDoctor Arch Guide

  25. BestDoctor Arch Guide

  26. Model и ORM • Обращения к ORM запрещены в слое

    представления • Model отвечают за описание схемы данных • Запрещены вызовы save() модели, мутирование моделей и данных в БД за пределами слоя Interactor’ов
  27. Selectors • Логика выборки данных из хранилища • Кеширование выборки

    • Аннотирование и кастомизация QuerySet • Запрещено модифицировать данные
  28. Interactors и Facades • Interactor — бизнес-действие, шаг пользовательского кейса

    • Facade — реализация кейса, комплексная логика • Facade — точка входа для слоя представления
  29. Interactors и Facades • Interactor — бизнес-действие, шаг пользовательского кейса

    • Facade — реализация кейса, комплексная логика • Facade — точка входа для слоя представления • При усложнении Interactor или Selector может стать Facade’ом • При усложнении из Facade должны выделяться Interactor’ы и Selector’ы
  30. Facades и слой представления • Десериализуем данные запроса (400 Validation

    Error) • Вызываем Facade • Получаем результат или ошибку (420 Business Logic Error) • Сериализуем/отрисовываем ответ
  31. Arch Guide и DRF • Serializer - только конвертация данных

    в формат для передачи, никаких агрегаций или трансформаций данных, “бизнес” валидаций • Каждый action — это по сути разбор запроса request serializer’ом, вызов facade и сериализация его ответа response serializer’ом • Нужны новые миксины для ViewSet
  32. Arch Guide и [Микро]сервисы • Django отвечает за хранение данных

    ◦ бизнес-логика сервиса отвечает за проверки целостности и консистентности ◦ В API только операции над сущностями ◦ никаких “прямых” правок базы через админку • Логику реализуют отдельные сервисы, в частности BFF ◦ бизнес-логика сервиса реализует бизнес кейсы
  33. Код написан не по Arch Guide

  34. Валидаторы и линтеры заставят помогут

  35. Любой гайд — лучше, чем без гайда.

  36. Привет от наших HR Senior Python Developer tg:@YuliaITHR Юля