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

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

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

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

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

53b0434aded1fb944ec3037c382158c1?s=128

Moscow Python Meetup

November 28, 2019
Tweet

Transcript

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

    Twitter: @alpolishchuk Facebook: alxpolishchuk
  2. Наша команда

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

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

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

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

    Основной Python Framework - Django • Основная библиотека JS - React
  7. Функции Django в проектах

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

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

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

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

    Провести валидацию данных • Сохранить данные в БД • Раздать данные сервисам в нужном им формате
  12. Минусы самописного API

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

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

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

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

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

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

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

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

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

    Facebook • «Имеет ряд преимуществ перед REST» (с) • «Убийца REST» (с)
  22. Фреймворк для REST

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

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

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

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

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

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

  29. А что же DRF?

  30. А что же DRF?

  31. А что же DRF?

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

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

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

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

    методах) • Писать кастомные методы проверки (aka «костыли») • django-graphene-permissions
  36. А что же DRF?

  37. А что же DRF?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  52. А что же DRF?

  53. А что же DRF?

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

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

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

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

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

  59. А что же DRF?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  84. А что же DRF?

  85. А что же DRF?

  86. Ошибки

  87. Ошибки

  88. А что же DRF?

  89. А что же DRF?

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

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

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

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

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

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

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

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

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

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

    вопрос привычки • Много схем, но в DRF тоже надо писать сериалайзеры • Формат ошибок • Производительность • Формат ответа – только JSON
  100. В итоге

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

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

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

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

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

  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