- Устанавливаем Python 2
# MacOS brew install python@2 # Ubuntu apt install python2
- Клонируем репозиторий
git clone https://github.com/subv13/gql.git /путь/до/проекта
- Создаём виртуальные окружение c python 2
virtualenv /путь/до/проекта/venv -p python2
- Устанавливаем зависимости
# Python 2 source venv/bin/activate pip install -r requirements.txt
- Устанавливаем хуки гита - запускают линтеры и форматтеры на коммиты.
pre-commit install
- Накатываем миграции
./manage.py migrate
- Создаём суперпользователя
./manage.py createsuperuser
- Загружаем фикстуры
./manage.py loaddata tablet.json
- Запускаем сервер
./manage.py runserver
- Открываем GraphiQL
Материалы
- Официальный гайд о GraphQL
- Спецификация GraphQL
- Хороший вводный доклад про GraphQL
- Анатомия запроса GraphQL
Основная библиотека для описание схемы GraphQL в python - graphene. Так же есть библиотека для graphene-django упрощающая интеграцию с Django
Материалы
- Общие правила написания схем GraphQL
- Репозиторий с правилами из доклада выше
- Описание подходов к пагинации
- Хороший подход к описанию сортировок и фильтров
Не нужно складывать описание всей схемы в один файл
Для того чтобы схема не превращалась в файл из тысяч строк лучше разбивать её на пакеты и модули. Например
Не использовать класс graphene.Mutation
Описание резолверов выглядит хорошо, а вот описание мутаций выглядит как что-то не из python. Не до конца понятно почему мутации реализовали в таком виде, когда их можно описать как обычные поля и будет намного pythonic. Например
Документировать сложные части схемы с помощь markdown
GraphiQl и другие клиенты могут рендерить markdown написанный в description
. Его можно писать в multiline строках, но важно чтобы не было отступов, поэтому лучше выносить в отдельную константу. Например
Наиболее удобный способ писать тесты для graphql - snapshot-тесты. Например
- Тестовый клиент
- Обёртка для получения запросов для теста. В python их удобней хранить отдельными файлами, если хранить строками в коде, то нет подсветки синтаксиса и валидации
- Сравнение со snapshot
В каждый резолвер и мутацию приходит аргумент info в котором есть context который по сути request из django из него можно достать информацию о сессии, юзере, etc
Для сокращения запросов есть история с даталоадерами ссылка, ссылка, ссылка
Для защиты от сложных запросов есть несколько разных подходов ссылка
Как генерировать правильно типы для фронтенда для разных релизов, новых веток, etc?
Репортер схемы в репозиторий схем??? ссылка
Что делать с newrelic, sentry, etc?
Как лучше возвращать ошибки? ссылка ссылка ссылка ссылка
Ошибки в Apollo Server ссылка