Этот пост является частью серии, которая переходит, как преобразовать существующую 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”