Рубрики
Без рубрики

Поверните API Python Rest API на GraphQL с помощью Asure Actions

Этот пост является частью серии, которая переходит, как преобразовать существующий API отдыха на Graphql jus … с меткой Python, GraphQL, Restapi, Hasura.

Этот пост является частью серии, которая переходит, как преобразовать существующую API отдыха на GraphQL, просто определяя типы и настроив конечных точек.

В этом посте мы посмотрим на использование Действия Hasura Для преобразования API Python Rest Post на GraphQL.

Как правило, настройка сервера GraphQL с нуля будет включать в себя запись схемы GraphQL, определения ввода и подключения к ней с Резольверы Отказ Благодаря действиям Hasura, сложность резольдентов письма снижается, так как можно просто написать конечную точку Post Post API и использовать это в качестве Resolver для запроса или мутации GraphQL.

Hasura дает вам мгновенное График CRUD для баз данных (в настоящее время postgres), которые должны охватывать большую часть корпусов подписки для получения данных и реальной вещении. Но когда есть какая-то деловая логика, которая должна быть написана, мы можем воспользоваться действиями Hasura для отображения API для отдыха, чтобы стать пользовательским Resolver. Мы посмотрим, как это сделать с Python в этом руководстве.

Создать облачный проект Hasura

Прежде чем начать, давайте создадим проект на Hasura Cloud настроить действие. Нажмите на развертывание кнопки Hasura ниже, подпишитесь на бесплатное и создайте новый проект.

Hasura требует от начала базы данных Postgres. Мы можем использовать бесплатные базы данных Postgres Geroku, чтобы попробовать это приложение.

Настройка базы данных облачного базы данных Hasura

После подписания с Heroku вы должны увидеть возможность создавать проект.

Предоставление базы данных Heroku Via Hasura Cloud

Как только вы закончите создание проекта, нажмите Запуск консоль Кнопка на Проекты Страница для вновь созданного проекта и консоль Hasura должна быть видна. Создавая этот проект, вы уже получили конечную точку GraphQL для базы данных Postgres, которая в мире доступна и масштабируется с самого начала.

Создать действие

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

Теперь давайте отправимся в Действия Вкладка на консоли Hasura и определите типы GraphQL для нашего приложения.

Определение действия

type Mutation {
  registerUser (
    name: String!
    email: String!
    password: String!
  ): UserOutput
}

Типы определения

type UserOutput {
  id : uuid!
}

Здесь мы определяем мутационный тип Зарегистрироваться который принимает Имя , Эл. адрес и пароль Аргументы и возвращает ID пользователя.

Мы можем настроить URL обработчик позже. Нажмите на Создать создать действие.

Давайте проверим, была ли создана настраиваемая мутация, направляясь на вкладку Graphiql и пробуя его.

mutation {
  registerUser(name: "Praveen", email: "praveen@hasura.io", password: "mysecretpassword") {
    id
  }
}

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

Теперь давайте пойдем вперед и на самом деле определим приложение Python и попробовать мутацию.

Codegen: Auto Generate Code Code Code

Теперь отправляйтесь на вкладку Codegen, чтобы автогенатировать код Boeterplate для сервера Python Flask. Поскольку мы генерируем API с нуля, нам нужна полная настройка сервера вместо того, чтобы только Пост обработчик.

Мы используем Python Framework Колбу Для этого примера также есть также котельная Python-Fast-API, которую можно использовать для репликации аналогичного примера. На самом деле, любой Python Server, который может служить конечной точке Post, можно использовать для обмена с этим примером.

Бизнес-логика Требуется:

  • Получить аргументы в действие имя , Эл. адрес и пароль на Запрос Отказ
  • Преобразуйте ввод пароля открытого текста в закрепленный пароль HASHED.
  • Отправьте мутацию Hasura, чтобы сохранить вновь созданный пользователь с помощью Haved Password.
  • Верните созданный пользовательский объект для сигнализации успеха или ошибки.

Сгенерированный кодеген (registerUser.py и registerUsertypes.py) можно скопировать в вашу файловую систему, чтобы начать внесение изменений в обработчик.

from registerUserTypes import registerUserArgs, UserOutput
from flask import Flask, request, jsonify

app = Flask( __name__ )

@app.route('/registerUser', methods=['POST'])
def registerUserHandler():
  args = registerUserArgs.from_request(request.get_json())
  print(args)
  # business logic here
  return UserOutput(id="1").to_json()

if __name__ == ' __main__':
  app.run(debug = True, host = '0.0.0.0')
from dataclasses import dataclass, asdict
from typing import List, Optional
from enum import Enum, auto
import json

@dataclass
class RequestMixin:
    @classmethod
    def from_request(cls, request):
        values = request.get("input")
        return cls(**values)

    def to_json(self):
        return json.dumps(asdict(self))

@dataclass
class UserOutput(RequestMixin):
  id: any

@dataclass
class Mutation(RequestMixin):
  registerUser: Optional[UserOutput]

@dataclass
class registerUserArgs(RequestMixin):
  name: str
  email: str
  password: str

После скопирования Codegen вы можете настроить колбу и начать запустить сервер:

Настройка колбы

Вы можете начать с установки колбы:

pip3 install flask

А затем запустите сервер Python, используя:

python3 registerUser.py

С этим вы должны начать видеть ваш сервер Flask, работающих на порту 5000.

С этим мы должны обновить URL-адрес нашего обработчика для действия, так что HTTP Call работает. Добавьте Зарегистрироваться Конечная точка, которая обрабатывает мутацию. Таким образом, окончательный URL обработчик будет выглядеть как http://localhost: 5000/registeruser Отказ

Поскольку нам нужен способ общаться с нашим сервером Python от экземпляра облака Hasura, нам нужно разоблачить сервер Python на публичном URL. Мы можем провести этот сервер в случае облака и указать, что URL/IP. Но для краткости этого учебника мы можем использовать NGROK , который дает публичные URL для разоблачения ваших локальных серверов для передачи облачного экземпляра.

Как только у вас установлен NGROK, вы можете запустить следующую команду:

ngrok http 5000

Это должно разоблачить ваш локальный сервер Python, работающий на порту 5000 на публичном URL (что-то вроде http://b4318818ea61.ngrok.io ).

Вернитесь на вкладку «Изменить» Зарегистрироваться Действие, которое было создано на консоли Hasura. Обновите URL обработчик к вышеупомянутому.

Это было бы похоже на http://b4318818ea61.ngrok.io/registeruser Отказ Обратите внимание на использование Зарегистрироваться Поскольку это конечная точка, мы обрабатываем мутацию в.

Наконец-то давайте попробуем ту же мутацию через GraphiQL, и соединение должно работать, возвращая манекен для ID Отказ

Мутация зарегистрирователя подается через Python

Хорошо! У нас есть рабочий API GraphQL, который разрешен с помощью API Python PORT, написанный с помощью колбы.

Теперь вы можете изменить код обработчика по мере необходимости, чтобы сделать любую бизнес-логику; Как подключение к другому API, подключение к базе данных (предпочтительно с использованием APIS Hasura) или с использованием ORM для различных баз данных и т. Д. Hasura позаботится о процветании мутации GraphQL вправому обработчику API для отдыха внутри.

Подключение к базе данных из внутренней колбы

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

Разрешения и отношения

Логика управления доступом для этого API GraphQL может быть выполнено с использованием системы разрешений на основе роли Hasura.

Перейдите к вкладке разрешений на странице действий, чтобы добавить роль и разрешить доступ.

В приведенном выше примере я создал роль под названием публичный Это разрешено сделать эту мутацию. Подробнее о том, как весь Аутентификация и авторизация Работает с Hasura, вы можете оформить заказ докторов.

Это разрешение может быть применено как к пользовательским запросам и мутациям. Давайте посмотрим на то, как это будет подать заявку на отношения. Теперь подумайте, что база данных Postgres имеет Пользователи стол. Мы можем подключить ID из Зарегистрироваться вывод на ID таблицы пользователей.

Отношения от действий к Postgres

Связанные данные также соответствуют разрешениям, определенным для соответствующей таблицы. (т.е. пользователи)

Существующий API отдыха

До сих пор мы смотрели, это создать API GraphQL с нуля, отображая его на новую конечную точку отдыха. Что, если есть существующая конечная точка API для отдыха, которую вы хотите повторно использовать как API GraphQL?

Вполне возможно сделать это, пока вы можете обрабатывать формат тела запроса, который Hasura отправляет в конечную точку. Формат выглядит что-то подобное:

{
  "action": {
    "name": ""
  },
  "input": {
    "arg1": "",
    "arg2": ""
  },
  "session_variables": {
    "x-hasura-user-id": "",
    "x-hasura-role": ""
  }
}

Таким образом, в нашем примере входные аргументы – имя, электронная почта и пароль были завернуты внутри вход объект. Теперь, если вы можете внести необходимые модификации для вашего существующего API для отдыха, чтобы обработать этот тело запроса, ваш API GraphQL будет работать, как ожидается:)

Поддерживаемые рамки

Это был пример с Python Flask. Но, как вы можете себе представить, это будет работать с любыми серверами Python Server, которая может служить конечной точке после Таким образом, вы можете технически использовать рамки, такие как Django, бутылка, боевики, пирамида, торнадо, Web2PY и так далее.

Развертывание Python API.

API Python может быть развернут как конечная точка Serverless, функция Lambda, если вы хотите архитекторизировать ваше приложение в 3 раза архитектура. Это действительно не имеет значения, где вы развертываете, например, в конце дня, Hasura просто нуждается в конечной точке HTTP Post для каждого обработчика действий.

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

Оригинал: “https://dev.to/hasurahq/turn-your-python-rest-api-to-graphql-using-hasura-actions-i0f”