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

Дмитрий Соболев. GraphQL в проекте на Python

Дмитрий Соболев. GraphQL в проекте на Python

Когда мы начинали новый проект, передо мной встал вопрос: какой технологический стек использовать? Обычно используют то, что знают хорошо или хотя бы неплохо, чтобы во время выполнения проекта не возникло внезапных сюрпризов. Но с другой стороны новый проект — это возможность попробовать что-то новое и интересное. Размышляя так, я протащил в этот проект GraphQL. Знал я про него тогда немного, но прошло время, и в этом докладе я бы хотел подвести некий промежуточный итог: стоит или нет использовать эту технологию, её плюсы и минусы, а также некоторые подводные подводные камни, на которые я наткнулся в ходе работы.

Python Community Chelyabinsk

December 05, 2019
Tweet

More Decks by Python Community Chelyabinsk

Other Decks in Programming

Transcript

  1. GraphQL в проекте
    на Python
    Дмитрий Соболев
    2019

    View Slide

  2. 2019
    Пролог

    View Slide

  3. Что такое GraphQL?
    2019

    View Slide

  4. 2019
    ● Очевидно, язык запросов
    ● Не связан с источниками данных
    ● Типизированный
    ● Позволяет получить только то, что нужно и не
    больше.

    View Slide

  5. 2019
    Информация о запросе:
    ● тип (query)
    ● название операции (ListUsers)
    ● информация о переменных

    View Slide

  6. 2019
    Что мы запрашиваем?
    ● может быть больше одного поля в
    запросе
    ● можно передать аргументы

    View Slide

  7. 2019
    Что мы хотим получить?
    ● По аналогии с корневым запросом,
    можно получить смежные данные

    View Slide

  8. 2019
    Типы запросов
    ● query
    получение данных
    все поля выполняются параллельно
    ● mutation
    изменение данных
    поля выполняются по порядку
    ● subscription
    получение обновлений в реальном времени

    View Slide

  9. 2019
    Schema definition language

    View Slide

  10. 2019
    Schema definition language
    Объявление директивы

    View Slide

  11. 2019
    Schema definition language
    Объявление скалярного типа

    View Slide

  12. 2019
    Schema definition language
    Объявление типа-структуры

    View Slide

  13. 2019
    Schema definition language
    Объявление типа-структуры, которая
    подается как аргумент на вход.

    View Slide

  14. 2019
    Schema definition language
    Специальные типы для определения
    возможных запросов и миграций

    View Slide

  15. 2019
    Разбиение схемы

    View Slide

  16. 2019
    https://graphql.org/learn/
    https://graphql.github.io/graphql-spec/June2018

    View Slide

  17. А что там у питонистов?
    2019

    View Slide

  18. 2019
    Graphene
    ● https://graphene-python.org
    ● https://github.com/graphql-python/graphene
    ● Порт GraphQL.js

    View Slide

  19. 2019
    Graphene

    View Slide

  20. 2019
    Tartiflette
    ● https://tartiflette.io
    ● https://github.com/tartiflette/tartiflette
    ● Использует SDL
    ● Асинхронная по-умолчанию

    View Slide

  21. 2019
    Tartiflette

    View Slide

  22. Проблемы
    и возможные пути обхода
    2019

    View Slide

  23. 2019
    Определение типов

    View Slide

  24. 2019
    Определение типов
    IPet

    View Slide

  25. 2019
    Определение типов

    View Slide

  26. 2019
    Определение типов

    View Slide

  27. 2019
    Вложенные input

    View Slide

  28. 2019
    Вложенные input

    View Slide

  29. 2019
    Вложенные input

    View Slide

  30. 2019
    Вложенные input

    View Slide

  31. 2019
    Проблема N+1
    Сколько будет вызовов при запросе 10 юзеров и 5 друзей?

    View Slide

  32. 2019
    Проблема N+1. Что делать?
    ● Ничего.
    ● Каким-то образом попытаться вытащить объекты второго
    уровня пачкой.
    ● Сделать умный query-builder, который подгружает смежные
    данные.

    View Slide

  33. 2019
    Загрузка файлов
    1. Предварительная загрузка файла на кеширующий сервер
    2. Кодирование содержимого в base64
    3. https://github.com/jaydenseric/graphql-multipart-request-spec

    View Slide

  34. Выводы
    2019

    View Slide

  35. 2019
    ● Неплохая замена swagger
    ● Не нужен, если уже есть настроенный и хорошо работающий swagger
    ● Хорошее решение для API Gateway

    View Slide

  36. 2019
    Ссылки
    ● https://graphql.org/learn/
    ● https://graphql.github.io/graphql-spec/June2018
    ● https://graphql.org
    ● https://graphene-python.org/
    ● https://tartiflette.io/
    ● https://github.com/jaydenseric/graphql-multipart-request-spec/
    ● https://github.com/dmitry-sobolev/graphql-meetup/

    View Slide

  37. Спасибо
    за внимание!
    2019
    Дмитрий Соболев

    View Slide