Примечание: этот пост является частью 1 в серии постов в блоге, которые я пишу, работая над официальной документацией для клубники. Первоначально он был опубликован мой блог .
Strawberry – это современная библиотека GraphQL Server для Python, которой просто понять и быстро начать. В этой серии мы узнаем, как использовать клубнику для создания полнофункционального API GraphQL.
Если вы впервые работаете с GraphQL, я бы порекомендовал прочитать первые 4 урока График Основы курс, чтобы узнать об основных понятиях, прежде чем продолжить.
Без лишних слов, давайте погрузимся!
Настройка среды
Для начала мы собираемся настроить нашу среду разработки. Поскольку Strawberry использует некоторые новые функции Python (например, обработки данных и подсказки типов), вам нужно убедиться, что вы запускаете Python 3.7 или выше. Вы можете проверить, какую версию Python вы установили, запустив $ python -версия
. Если у вас нет Python.7, установленного на вашей машине, вам нужно это настроить. Я рекомендую использовать Pyenv
для этого.
После установки Python 3.7 вам нужно настроить виртуальную среду и установить клубнику.
$ python --version Python 3.7.4 $ python -m venv venv $ source venv/bin/activate $ pip install strawberry-graphql
Ницца! Вы готовы начать работу.
Привет, мир!
Давайте создадим файл с именем app.py
и подключить базовое приложение для клубники:
import strawberry @strawberry.type class Query: @strawberry.field def hello(self, info) -> str: return "world" schema = strawberry.Schema(query=Query)
Начнем с определения Запрос
тип. Мы используем Strawberry.Type
декоратор, чтобы отметить этот класс как Затем мы определяем функцию разрешения, используя Strawberry.field
декоратор. Функции резолюра принимают два позиционных аргумента ( self
и Информация
) и должен указать тип возврата. В этом случае мы определяем функцию разрешения, называемая Привет
, который возвращает строку "Мир"
Анкет
Чтобы запустить наш запрос, нам нужно разоблачить его с помощью схемы. Чтобы сделать это, мы проходим в нашем Запрос
Класс как аргумент Strawberry.schema
Анкет
Strawberry поставляется со встроенным сервером, чтобы помочь вам быстро встать и работать. Чтобы начать это, используя ваш app.py
Файл, запустить:
$ strawberry server app Running strawberry on http://0.0.0.0:8000/graphql 🍓
Откройте свой браузер, чтобы http://localhost: 8000/graphql и вы можете проверить свой запрос на игровой площадке GraphQL. Попробуйте запустить свой запрос, набрав его на правой панели, и нажав Запустить
:
query { hello }
Вы должны получить ответ, который выглядит как:
{ "data": { "hello": "world" } }
Поздравляю! Вы написали свой первый Resolver GraphQL с Strawberry!
Пользовательские типы
Теперь мы собираемся попробовать более интересный пример. Допустим, мы хотим построить приложение Todo List. Нам понадобится сохранение списка задач с их статусами (сделано или не сделано). Чтобы запросить эти данные, нам нужно быть в состоянии вернуть пользовательский тип, который представляет объект TODO. Мы сделаем это, определив пользовательский тип GraphQL. Используя клубнику, мы можем определить пользовательский тип GraphQL, например, SO:
@strawberry.type class TodoType: name: str done: bool
Здесь мы создаем тип, используя Strawberry.Type
декоратор, с str
Атрибут называется имя
и Bool
Атрибут называется Готово
Анкет Это определит тип GraphQL со следующим SDL:
type TodoType { name: String! age: Boolean! }
Теперь давайте использовать его в запросе. Мы определим запрос и функцию разрешения, как мы это делали в прошлый раз, только на этот раз мы назваем функцию Тодос
, дайте ему возвратный тип Список [todotype]
, и пусть он вернет наше множество Тодоса. Это должно выглядеть примерно так:
from typing import List todos = [ TodoType(name="Todo #1", done=False), TodoType(name="Todo #2", done=False), TodoType(name="Todo #3", done=True) ] @strawberry.type class Query: @strawberry.field def todos(self, info) -> List[TodoType]: return todos
Давайте проверим это на игровой площадке GraphQL. Если мы запустим этот запрос:
query { todos { name done } }
Мы должны получить следующий ответ:
{ "data": { "todos": [ { "name": "Todo #1", "done": false }, { "name": "Todo #2", "done": false }, { "name": "Todo #3", "done": true } ] } }
Потрясающий! Мы создали пользовательский тип и пользовательский резолвер, который возвращает этот тип.
Аргументы резолюра
Еще одна важная особенность любого приложения TODO – это возможность фильтровать ваш Todos по их статусу. Чтобы сделать это, нам нужно было бы передать дополнительные параметры в наш запрос GraphQL. С помощью клубники вы можете добавить параметр в любое определение резоливера, добавив типизированный входной аргумент в функцию разрешения. Если вы предоставите значение по умолчанию для входного аргумента, параметр будет необязательным в вашей схеме GraphQL.
В нашем случае мы хотим иметь возможность фильтровать наш тодо по их Готово
Значение, поэтому мы добавим аргумент под названием Готово
типа буль
. Мы также добавим некоторую логику в резольвер, чтобы фильтровать Todos в нашем массиве:
@strawberry.type class Query: @strawberry.field def todos(self, info, done: bool = None) -> List[TodoType]: if done is not None: return filter(lambda todo: todo.done == done, todos) else: return todos
Если мы снова запустим наш запрос с Готово
Параметр, мы должны увидеть результаты. Запуск этого запроса:
query { todos(done: true) { name done } }
вернется:
{ "data": { "todos": [ { "name": "Todo #3", "done": true } ] } }
Вот! Теперь у вас есть работающий API GraphQL с использованием Strawberry. Это только царапает поверхность того, что может сделать клубника. Если вы хотите узнать больше, проверьте Strawberry на GitHub .
Оригинал: “https://dev.to/jaydenwindle/building-graphql-apis-with-strawberry-part-1-queries-il8”