Как получить мгновенные API GraphQL в существующей программе Django

1656546263 kak poluchit mgnovennye api graphql v sushhestvuyushhej programme django

автор Картик Венкатесваран

1*BRtPUVYOTcVmiL0GlytYAQ
API GraphQL в вашем существующем приложении Django

TL; DR

Вот темы, которые мы рассмотрим в этой статье, если вы хотите прыгать вокруг:

Почему GraphQL?

GraphQL — язык запросов данных, разработанный Facebook. Он не привязан к какой-либо конкретной базе данных. Он предоставляет клиенту возможность одновременно осуществлять запросы из разных баз данных, спрашивая то, что ему нужно. Он возвращает ответ в запрашиваемом клиентом формате

Создайте сервер GraphQL

Каковы различные подходы для создания сервера GraphQL? Мы узнаем, как механизм Hasura GraphQL обеспечивает самый простой способ получить API GraphQL в существующей базе данных.

Настроить двигатель GraphQL

Мы расскажем об установке движка Hasura GraphQL. Затем мы предоставим таблицы через API GraphQL.

Защита сервера GraphQL

Обработать миграцию

Итак начнем!

Почему GraphQL?

В типичной программе Django любые новые требования к функциям или изменение схемы потребуют добавления или изменения существующего представления. Это может оказать огромное влияние на производительность разработчиков. Для этого требуется обновление кода во всех местах, где используется конкретный API.

Вот где GraphQL пригодится. GraphQL – это язык запросов для API. Он абстрагирует несколько источников данных. Это позволяет разработчикам приложений запрашивать данные в нужном формате. Это делает это, не требуя каких-либо изменений в серверном API. Вместо того чтобы вызвать отдельные конечные точки для получения данных, мы вызываем одну конечную точку. Мы получаем всю необходимую информацию, структурированную именно так, как мы хотим.

Это может заставить вас задуматься: как мне получить API GraphQL в моей существующей программе Django?

Создайте сервер GraphQL

Чтобы создать сервер GraphQL, все, что вам нужно сделать, это определить a схема. Схема это каталог типов данных в вашем приложении. Функции резольвера сказать серверу, где и как получить данные для каждого типа данных.

Современные подходы подразумевают написание его с нуля (схема, функции резольвера) с помощью таких инструментов, как django-graphene.

В этой публикации я буду использовать механизм Hasura GraphQL для получения API GraphQL в моей существующей программе Django, которая работает локально. Мы придем к решению, как показано на схеме ниже.

1*rDlZ3Ejok1L-IvmpyUTu4w
Архитектура до и после интеграции с движком Hasura GraphQL

Механизм Hasura GraphQL (HGE) дает вам мгновенный API GraphQL в реальном времени поверх вашего существующего Postgres. HGE работает «из коробки» с имеющимися:

  • База данных Postgres Подключается к существующей базе данных и предоставляет API GraphQL для вашей базы данных.
  • Система аутентификации Подключается к существующей системе аутентификации для защиты GraphQL API.
  • Миграционная система Hasura GraphQL Engine не мешает существующей системе передвижения Django. Схемой можно управлять отдельно через models.py и django мигрировать до тех пор пока это не изменит схему, отслеживаемую GraphQL Engine. Больше информации о том, как механизм Hasura GraphQL управляет состоянием вашей схемы, можно найти здесь.

Кроме того, он поставляется с превосходной консолью (подобной администратору Django), которую можно использовать для отладки API GraphQL.

Установка

Двигатель Hasura GraphQL можно установить на Heroku с помощью кнопки ниже:

1*dcgu-klnpwTWilYiGMdM6Q
Нажмите эту кнопку, чтобы развернуть механизм GraphQL на Heroku

или на любую машину, на которой можно запустить Docker. Дополнительную информацию см. в разделе «Начало работы».

Установка с помощью докера и подключение к существующему Postgres

Прежде чем я установлю Hasura GraphQL Engine, мне нужно получить строчку подключения Postgres для подключения движка Hasura GraphQL к базе данных. Я могу получить строку подключения Postgres из моей программы settings.py.

DATABASES = { 
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'SECUREPASSWORD',
        'HOST': '172.17.0.1',
        'PORT': '5432',
    }   
}

URL-адрес подключения к базе данных станет:

postgres://postgres:SECUREPASSWORD@172.17.0.1:5432/postgres

После запуска механизма Hasura GraphQL откроется консоль Hasura, как показано ниже. The Данные Раздел показывает список неотслеживаемых таблиц, присутствующих в базе данных, сгруппированных по схеме. Если вам интересно, что такое таблицы без отслеживания, перейдите к документам для получения дополнительной информации.

1*dJlxjx1PHK5flNXiKVy5sg
Консоль Hasura GraphQL Engine
1*S7hBC1Hefyr1ho3RcneXmw
Консоль Hasura Проводник данных

На снимке экрана выше приведены таблицы, созданные программой Django, как определено в этом models.py файл под неотслеживаемыми таблицами. Нажатие кнопки «Добавить» отображается в списке отслеживаемых таблиц слева. Это дает им возможность запрашивать через API GraphQL:

1*DU43Tx-lE4AK6CtFlVWRdw

Чтобы проверить, работает ли все, давайте попробуем получить все authors доступны в таблице:

query {
  medium_author {
    id
    name
    interests
  }
}

Ответ от двигателя GraphQL:

{
  "data": {
    "medium_author": [
      {
        "name": "Karthik",
        "id": 2,
        "interests": "Cricket, Music, Code"
      },
      {
        "name": "Second Author",
        "id": 4,
        "interests": "Hockey"
      }
    ]
  }
}

Связь объекта и массива

Механизм GraphQL анализирует вашу схему и предлагает связи на основе внешних ключей, определенных между таблицами.

1*b0o9K84Qsfy2khrriNKJxg
Предлагаемые отношения внешнего ключа

Механизм GraphQL автоматически предлагает два отношения для каждого внешнего ключа, который он встречает.

  • Объектная связь: отношение 1:1. Например, одна статья будет иметь только одного автора.
  • Отношение массива: 1: много. К примеру, один автор может написать много статей.

В схеме блога, mediumArticlesByauthorId есть «отношение массива». Он основан на внешнем ключе medium_article :: author_id -> идентификатор в тhe medium_articлe. mediumAuthorByAuthorId – это «объектные отношения», основанные на том же внешнем ключе.

Когда мы отслеживаем эти дела, производная схема GraphQL содержит имена отношений. И таблицы, и отношения можно спросить в одном запросе:

1*tSg46B7TF20ceET3rYLboQ
Запрос GraphQL со связью с массивом
1*zeALwfd78Oqp2glGKG8oqw
Запрос GraphQL с объектной связью

Аутентификация

По умолчанию двигатель GraphQL устанавливается в режиме разработки. Все таблицы/представления, отслеживаемые механизмом GraphQL, можно просматривать/обновлять без каких-либо проверок. Это небезопасно и не рекомендуется для производственной среды.

Hasura позволяет определить подробные средства контроля доступа для каждого поля в вашей схеме GraphQL, в основном для каждой таблицы или представления в вашей схеме Postgres. Эти правила контроля доступа могут использовать динамические переменные, поступающие по каждому запросу. Дополнительные сведения см. в документах.

Механизм GraphQL можно защитить от прямого доступа к нему, настроив URL вебхука. Это будет вызвано механизмом GraphQL для проверки каждого запроса, если запрос не содержит действительный access-key.

1*pX9ydrpIK9angEvmCHkKrA
Архитектура того, как происходит запрос/ответ

Прежде чем защитить конечную точку GraphQL с помощью access-key и auth-hook(URL-адрес веб-хука), давайте добавим простое правило контроля доступа с помощью консоли Hasura для ограничения author чтобы получить только его данные и запросить проводник GraphQL.

Вот как выглядит правило контроля доступа для medium_author таблица для роли =user.

1*sjF-pudjQP96I8X8IMOebQ
Добавить контроль доступа к таблице авторов

Я создал только select разрешение, но вы можете настроить для всех четырех типов операций (выбор, вставка, обновление, удаление). Дополнительные сведения см. в документах.

Давайте спросить с medium_author таблицу и посмотрите, какой ответ:

1*yaSciD7j9zo12Ph1JbBYqQ

Здесь, пожалуйста, обратите внимание на это x-hasura-user-id установлено на «2» и x-hasura-role установлено на «пользователь». Это auth данные, которые будут переданы auth-hook в производственном режиме (движок GraphQL запущен с access-key и auth-hook).

Защищенный API GraphQL

Давайте защитим двигатель GraphQL с помощьюaccess-key. Давайте настроим auth-hook с помощью обработчика аутентификации, в этом случае приложения Django. Настроен вебхук будет вызван механизмом GraphQL. Вебхук вернет соответствующее значениеx-hasura-role и x-hasura-user-id.

version: '3.6'
services:
  postgres:
    image: postgres
    environment:
    - "POSTGRES_PASSWORD:mysecretpassword"
    ports:
    - "5432:5432"
    restart: always
    volumes:
    - db_data:/var/lib/postgresql/data
  graphql-engine:
    image: hasura/graphql-engine:v1.0.0-alpha13
    ports:
    - "8080:8080"
    depends_on:
    - "postgres"
    restart: always
    environment:
      HASURA_GRAPHQL_DATABASE_URL: postgres://postgres:mysecretpassword@postgres:5432/postgres
    command:
      - graphql-engine
      - serve
      - --access-key=mysecretkey
      - --auth-hook=
      - --enable-console
volumes:
  db_data:

Давайте попробуем сделать запрос еще раз и посмотрим, какой ответ:

1*afYqLtDIyrJyR7RU7iG6_w

Настроен вебхук отклоняет, поскольку запрос не аутентифицирован. Попробуем войти как пользователь и запросить с помощью токена аутентификации пользователя. Система авторизации Django решается cookies. Он добавляет информацию о пользователе в контекст запроса, который затем может использоваться обработчиком запроса.

Для этого блога я написал простое ПО для авторизации. Это будет разбор Authorization: Bearer <token> и разрешите его у пользователя Django. Пользователь будет добавлен в контекст запроса. Вот фрагмент кода того же.

1*YTesXQ80z4olokviXp-uTA
Войти под пользователем с идентификатором = 2
1*I2DOakdiY0X-3bm7UGk9ZQ
Запрос с входящим пользователем

Пользователя аутентифицируют с помощью вебхука. Вебхук возвращает соответствующее x-hasura-user-id и x-hasura-role. Механизм GraphQL соответствует соответствующим результатам, настроенным в правилах доступа.

Миграционная система

Механизм Hasura GraphQL поставляется с мощными инструментами миграции на основе Rails, которые помогут вам отслеживать изменения, внесенные в свою схему. При использовании консоли Hasura, Hasura CLI выдаст вам файлы миграции. Вы можете поместить их на контроль версий и даже отредактировать.

По умолчанию консоль Hasura обслуживается двигателем GraphQL. Его можно использовать для быстрого тестирования функций, предоставленных механизмом GraphQL. Однако если вы создаете сложную программу или добавляете Hasura в существующую программу или базу данных, вам нужно будет сохранить миграцию, чтобы обеспечить бесперебойную итерацию и CI/CD.

Настройка

Установить hasura выполнив следующую команду на своем терминале, если вы используете компьютер Mac/Linux. В противном случае перейдите к нашим документам, чтобы установить hasura в разных средах.

curl -L  | bash

Выполнение следующей команды инициализирует каталог с файлами конфигурации hasura, настроенными на использование механизма GraphQL.

$ hasura init --directory blog-hasura-app --endpoint  --access-key=mysecretkey
1*kMA2X_j9L9alBH7w8MnjNw
hasura init

Замените значение endpoint и access-key к соответствующим ценностям.

Выключить миграцию

Поскольку Django занимается миграцией по умолчанию, миграцию Hasura можно отключить, введя hasura console на вашем терминале. Чтобы открыть консоль Hasura, перейдите к Данные -> Миграцияns (на навигационной панели слева) и disable Allow postgres schema changes.

Мы все еще можем хранить метаданные Hasura только для того, чтобы приложение всегда находилось в состоянии, которое можно восстановить:

1*Wo4dKt2qPkKkPnoIbPDShg
Прежде чем отключить миграцию
1*5ttl3UM-iQKdHCxUt5KUdw
После выключения миграции

Экспорт метаданных

Экспортируйте метаданные Hasura и сохраните их в папке миграции. Это гарантирует, что вашу систему всегда можно восстановить из любого нежелательного состояния.

hasura metadata export

Вышеуказанная команда экспортирует файл metadata.yaml и хранить его внутри migrationsпапку.

1*32kfQrUSc6qQBljLhTgFYQ

Пожалуйста, убедитесь, что таблицы/представления создаются/изменяются только с помощью Django models.py файл, чтобы избежать несоответствия.

Если вы хотите вместо этого использовать систему миграции Hasura, просмотрите документацию для получения дополнительной информации.

Хассура дает вам мгновенные API GraphQL в реальном времени через любую базу данных Postgres без необходимости писать любой бэкенд-код.

Для тех из вас, кто только начинает работать с двигателем Hasura GraphQL, это это хорошее место для начала.

Добавить комментарий

Ваш адрес email не будет опубликован.