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

Как мы не внедрили GraphQL

Как мы не внедрили GraphQL

Александр Полищук (ООО "Код Безопасности", Team Lead) @ MoscowPython Meetup 70

"В один прекрасный момент мы пришли к тому, что нам необходимо переписать наше самописное API. Помимо классического REST мы решили рассмотреть и GraphQL. О результатах — в докладе (спойлер в названии)".

Видео: http://www.moscowpython.ru/meetup/70/no-graphql/

Moscow Python Meetup
PRO

November 28, 2019
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. Как мы не внедрили
    GraphQL
    Александр Полищук
    ООО «Код Безопасности»
    Twitter: @alpolishchuk
    Facebook: alxpolishchuk

    View Slide

  2. Наша команда

    View Slide

  3. Наша команда
    • 6 человек

    View Slide

  4. Наша команда
    • 6 человек
    • Python + JS

    View Slide

  5. Наша команда
    • 6 человек
    • Python + JS
    • Основной Python Framework - Django

    View Slide

  6. Наша команда
    • 6 человек
    • Python + JS
    • Основной Python Framework - Django
    • Основная библиотека JS - React

    View Slide

  7. Функции Django в проектах

    View Slide

  8. Функции Django в проектах
    • Принять данные от администратора

    View Slide

  9. Функции Django в проектах
    • Принять данные от администратора
    • Провести валидацию данных

    View Slide

  10. Функции Django в проектах
    • Принять данные от администратора
    • Провести валидацию данных
    • Сохранить данные в БД

    View Slide

  11. Функции Django в проектах
    • Принять данные от администратора
    • Провести валидацию данных
    • Сохранить данные в БД
    • Раздать данные сервисам в нужном им
    формате

    View Slide

  12. Минусы самописного API

    View Slide

  13. Минусы самописного API
    • Код очень плохо читаем

    View Slide

  14. Минусы самописного API
    • Код очень плохо читаем
    • Много непонятных и ненужных
    зависимостей внутри

    View Slide

  15. Минусы самописного API
    • Код очень плохо читаем
    • Много непонятных и ненужных
    зависимостей внутри
    • Проблема с расширяемостью

    View Slide

  16. Минусы самописного API
    • Код очень плохо читаем
    • Много непонятных и ненужных
    зависимостей внутри
    • Проблема с расширяемостью
    • Скорость работы этого API под большим
    вопросом (см. пункт 2)

    View Slide

  17. Почему GraphQL

    View Slide

  18. Почему GraphQL
    • Давно на слуху

    View Slide

  19. Почему GraphQL
    • Давно на слуху
    • Разрабатывается и используется Facebook

    View Slide

  20. Почему GraphQL
    • Давно на слуху
    • Разрабатывается и используется Facebook
    • «Имеет ряд преимуществ перед REST» (с)

    View Slide

  21. Почему GraphQL
    • Давно на слуху
    • Разрабатывается и используется Facebook
    • «Имеет ряд преимуществ перед REST» (с)
    • «Убийца REST» (с)

    View Slide

  22. Фреймворк для REST

    View Slide

  23. Фреймворк для GraphQL

    View Slide

  24. Фреймворк для GraphQL

    View Slide

  25. Схема для тестирования

    View Slide

  26. Схема для тестирования
    • 2 связанные модели (пицца и наполнители)

    View Slide

  27. Единая точка входа

    View Slide

  28. Единая точка входа

    View Slide

  29. А что же DRF?

    View Slide

  30. А что же DRF?

    View Slide

  31. А что же DRF?

    View Slide

  32. Проблема с разрешениями

    View Slide

  33. Проблема с разрешениями
    • Делать проверки в mutate (или иных
    методах)

    View Slide

  34. Проблема с разрешениями
    • Делать проверки в mutate (или иных
    методах)
    • Писать кастомные методы проверки (aka
    «костыли»)

    View Slide

  35. Проблема с разрешениями
    • Делать проверки в mutate (или иных
    методах)
    • Писать кастомные методы проверки (aka
    «костыли»)
    • django-graphene-permissions

    View Slide

  36. А что же DRF?

    View Slide

  37. А что же DRF?

    View Slide

  38. Запрос «спрятан» в теле POST

    View Slide

  39. Запрос «спрятан» в теле POST
    • http://127.0.0.1:8000/rest/pizza/1/

    View Slide

  40. Запрос «спрятан» в теле POST
    • http://127.0.0.1:8000/rest/pizza/1/
    • http://127.0.0.1:8000/graphql/

    View Slide

  41. Расширяемость

    View Slide

  42. Расширяемость
    • Достаточно описать ObjectType и добавить
    его в схему

    View Slide

  43. Желаемые атрибуты в запросе

    View Slide

  44. Желаемые атрибуты в запросе

    View Slide

  45. Желаемые атрибуты в запросе

    View Slide

  46. Желаемые атрибуты в запросе

    View Slide

  47. Желаемые атрибуты в запросе

    View Slide

  48. Желаемые атрибуты в запросе

    View Slide

  49. Но клиенту придется писать запросы

    View Slide

  50. Но клиенту придется писать запросы

    View Slide

  51. Но клиенту придется писать запросы

    View Slide

  52. А что же DRF?

    View Slide

  53. А что же DRF?

    View Slide

  54. Получение нескольких объектов по
    параметрам в одном запросе

    View Slide

  55. Получение нескольких объектов по
    параметрам в одном запросе

    View Slide

  56. Получение нескольких объектов по
    параметрам в одном запросе

    View Slide

  57. Но их надо описывать

    View Slide

  58. Но их надо описывать

    View Slide

  59. А что же DRF?

    View Slide

  60. А что же DRF?
    • django-filter

    View Slide

  61. Интеграция с Django и DRF

    View Slide

  62. Интеграция с Django и DRF
    • DjangoObjectType

    View Slide

  63. Интеграция с Django и DRF
    • DjangoObjectType
    • Django Forms

    View Slide

  64. Интеграция с Django и DRF
    • DjangoObjectType
    • Django Forms
    • DRF Serializers

    View Slide

  65. Преимущества GraphQL

    View Slide

  66. Преимущества GraphQL
    • Единая точка входа, но есть проблема с
    настройкой пермишнов

    View Slide

  67. Преимущества GraphQL
    • Единая точка входа, но есть проблема с
    настройкой пермишнов
    • Все запросы через POST

    View Slide

  68. Преимущества GraphQL
    • Единая точка входа, но есть проблема с
    настройкой пермишнов
    • Все запросы через POST
    • Хорошая расширяемость, но нужна
    синхронизация схемы с клиентом

    View Slide

  69. Преимущества GraphQL
    • Единая точка входа, но есть проблема с
    настройкой пермишнов
    • Все запросы через POST
    • Хорошая расширяемость, но нужна
    синхронизация схемы с клиентом
    • Атрибуты в запросе, но клиент должен сам писать
    все запросы

    View Slide

  70. Преимущества GraphQL
    • Единая точка входа, но есть проблема с
    настройкой пермишнов
    • Все запросы через POST
    • Хорошая расширяемость, но нужна
    синхронизация схемы с клиентом
    • Атрибуты в запросе, но клиент должен сам писать
    все запросы
    • Получение нескольких объектов по параметрам в
    одном запросе, но это надо описывать

    View Slide

  71. Преимущества GraphQL
    • Единая точка входа, но есть проблема с
    настройкой пермишнов
    • Все запросы через POST
    • Хорошая расширяемость, но нужна
    синхронизация схемы с клиентом
    • Атрибуты в запросе, но клиент должен сам писать
    все запросы
    • Получение нескольких объектов по параметрам в
    одном запросе, но это надо описывать
    • Хорошая интеграция с Django, можно
    использовать формы и даже сериалайзеры DRF

    View Slide

  72. Документация

    View Slide

  73. Документация

    View Slide

  74. Синтаксис запросов

    View Slide

  75. Синтаксис запросов

    View Slide

  76. Схемы (получение)

    View Slide

  77. Схемы (получение)

    View Slide

  78. Схемы (получение)

    View Slide

  79. Схемы (мутации)

    View Slide

  80. Схемы (мутации)

    View Slide

  81. Схемы (мутации)

    View Slide

  82. Схемы (общая схема)

    View Slide

  83. Схемы (общая схема)

    View Slide

  84. А что же DRF?

    View Slide

  85. А что же DRF?

    View Slide

  86. Ошибки

    View Slide

  87. Ошибки

    View Slide

  88. А что же DRF?

    View Slide

  89. А что же DRF?

    View Slide

  90. Тестирование производительности

    View Slide

  91. Тестирование производительности

    View Slide

  92. Тестирование производительности

    View Slide

  93. Недостатки GraphQL

    View Slide

  94. Недостатки GraphQL
    • Документация

    View Slide

  95. Недостатки GraphQL
    • Документация
    • Синтаксис запросов, но это больше вопрос
    привычки

    View Slide

  96. Недостатки GraphQL
    • Документация
    • Синтаксис запросов, но это больше вопрос
    привычки
    • Много схем, но в DRF тоже надо писать
    сериалайзеры

    View Slide

  97. Недостатки GraphQL
    • Документация
    • Синтаксис запросов, но это больше вопрос
    привычки
    • Много схем, но в DRF тоже надо писать
    сериалайзеры
    • Формат ошибок

    View Slide

  98. Недостатки GraphQL
    • Документация
    • Синтаксис запросов, но это больше вопрос
    привычки
    • Много схем, но в DRF тоже надо писать
    сериалайзеры
    • Формат ошибок
    • Производительность

    View Slide

  99. Недостатки GraphQL
    • Документация
    • Синтаксис запросов, но это больше вопрос
    привычки
    • Много схем, но в DRF тоже надо писать
    сериалайзеры
    • Формат ошибок
    • Производительность
    • Формат ответа – только JSON

    View Slide

  100. В итоге

    View Slide

  101. В итоге
    • Практически все преимущества выливаются
    в большой объем работы на клиенте

    View Slide

  102. В итоге
    • Практически все преимущества выливаются
    в большой объем работы на клиенте
    • Для решения задач приходится гуглить,
    документации совсем недостаточно, снова
    потери времени

    View Slide

  103. В итоге
    • Практически все преимущества выливаются
    в большой объем работы на клиенте
    • Для решения задач приходится гуглить,
    документации совсем недостаточно, снова
    потери времени
    • Надо привыкать к языку запросов - время

    View Slide

  104. В итоге
    • Практически все преимущества выливаются
    в большой объем работы на клиенте
    • Для решения задач приходится гуглить,
    документации совсем недостаточно, снова
    потери времени
    • Надо привыкать к языку запросов - время
    • По производительности сильно уступает
    DRF

    View Slide

  105. В итоге

    View Slide

  106. Спасибо за внимание
    DRF Docs: https://www.django-rest-framework.org/
    Graphene Docs: https://graphene-python.org/
    Demo: https://github.com/alpolishchuk/graph-rest
    Статья на Хабре: https://habr.com/ru/post/461939/
    Twitter: @alpolishchuk
    Facebook: alxpolishchuk

    View Slide