Graphene – GraphQL на Python

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение в GraphQL и Graphene

GraphQL — это язык запросов к API и среда выполнения, разработанные Facebook для повышения гибкости и эффективности обмена данными между клиентом и сервером. Graphene — это реализация GraphQL на Python, предоставляющая мощные инструменты для создания API с типизированной схемой, поддержкой мутаций и интеграцией с ORM.


Преимущества GraphQL по сравнению с REST

  • Один эндпоинт вместо множества

  • Гибкие запросы: клиент сам определяет структуру ответа

  • Получение только необходимых данных

  • Объединение вложенных сущностей в один запрос

  • Статическая типизация схемы

  • Автоматическая генерация документации


Установка и настройка Graphene

Установка базового пакета:

bash
pip install graphene

Для интеграции с Flask:

bash
pip install flask-graphql

Для Django:

bash
pip install graphene-django

Создание базового GraphQL-сервера

Пример с использованием Flask:

python
from flask import Flask from flask_graphql import GraphQLView import graphene app = Flask(__name__) class Query(graphene.ObjectType): hello = graphene.String() def resolve_hello(self, info): return "Привет, GraphQL" schema = graphene.Schema(query=Query) app.add_url_rule('/graphql', view_func=GraphQLView.as_view( 'graphql', schema=schema, graphiql=True )) if __name__ == '__main__': app.run()

Определение типов и схем в Graphene

Создание пользовательского типа:

python
class User(graphene.ObjectType): id = graphene.Int() name = graphene.String()

Определение схемы:

python
class Query(graphene.ObjectType): user = graphene.Field(User, id=graphene.Int()) def resolve_user(self, info, id): return User(id=id, name="Пользователь")

Запросы (Queries): структура и обработка

Пример запроса:

graphql
{ user(id: 1) { id name } }

Ответ:

json
{ "data": { "user": { "id": 1, "name": "Пользователь" } } }

Мутации (Mutations): изменение данных

Определение мутации:

python
class CreateUser(graphene.Mutation): class Arguments: name = graphene.String() ok = graphene.Boolean() user = graphene.Field(lambda: User) def mutate(self, info, name): user = User(name=name) return CreateUser(user=user, ok=True) class Mutation(graphene.ObjectType): create_user = CreateUser.Field()

Запрос мутации:

graphql
mutation { createUser(name: "Иван") { ok user { name } } }

Аргументы в запросах и мутациях

Graphene позволяет задавать аргументы через class Arguments. Все аргументы валидируются автоматически по типу.

python
class Arguments: id = graphene.Int(required=True)

Резолверы (resolvers): логика обработки

Каждое поле схемы имеет свою функцию-резолвер. Они принимают параметры:

  • self — объект (если используется ObjectType)

  • info — информация о запросе (контекст, схема)

  • остальные — аргументы запроса

python
def resolve_user(self, info, id): return User(id=id, name="Иван")

Подключение к базе данных (SQLAlchemy, Django ORM)

Для SQLAlchemy:

bash
pip install graphene-sqlalchemy
python
from graphene_sqlalchemy import SQLAlchemyObjectType class UserModel(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) class User(SQLAlchemyObjectType): class Meta: model = UserModel

Работа с вложенными объектами и связями

python
class Post(graphene.ObjectType): title = graphene.String() class User(graphene.ObjectType): name = graphene.String() posts = graphene.List(Post) def resolve_posts(self, info): return [Post(title="Первый пост"), Post(title="Второй пост")]

Использование Graphene-Django

Добавление в INSTALLED_APPS:

python
'graphene_django',

Конфигурация:

python
GRAPHENE = { "SCHEMA": "myproject.schema.schema" }

Создание типов:

python
from graphene_django import DjangoObjectType class UserType(DjangoObjectType): class Meta: model = User

Интеграция с Flask и FastAPI

Flask: через flask-graphql
FastAPI: через graphene и starlette_graphene3:

bash
pip install starlette-graphene3

Авторизация и аутентификация

Передача контекста:

python
def resolve_user(self, info): user = info.context.get("user") if not user.is_authenticated: raise Exception("Недоступно")

В Flask:

python
GraphQLView.as_view("graphql", schema=schema, context={"user": current_user})

Обработка ошибок и валидация

Ошибки можно обрабатывать в резолверах и мутациях:

python
if not name: raise ValueError("Имя обязательно")

Тестирование GraphQL API

Пример с requests:

python
import requests query = '{"query":"{ user(id:1) { name } }"}' res = requests.post("http://localhost:5000/graphql", json=query)

Производительность и пагинация

Graphene поддерживает пагинацию через:

  • Списки с аргументами (first, skip)

  • Relay-совместимые интерфейсы

  • Кэширование и DataLoader


Инструменты и IDE для работы с GraphQL

  • GraphiQL (встроенный интерфейс)

  • Postman (GraphQL режим)

  • Insomnia

  • GraphQL Playground

  • VSCode расширения (GraphQL LSP)


Примеры практического применения

  • Создание единого API для фронтенда и мобильных клиентов

  • Управление данными через вложенные запросы

  • Агрегация из разных источников (базы данных, API)

  • Интеграция с Django-админкой через GraphQL

  • Построение масштабируемых микросервисов


Часто задаваемые вопросы

Что такое Graphene?

Это библиотека Python для создания GraphQL API.

Чем GraphQL лучше REST?

Гибкость запросов, отсутствие избыточности, поддержка вложенных структур.

Поддерживается ли Django?

Да, через graphene-django.

Graphene работает с SQLAlchemy?

Да, через graphene-sqlalchemy.

Есть ли поддержка авторизации?

Да, с передачей пользовательского контекста.

Полный справочник по ключевым функциям и модулям библиотеки Graphene для Python

Основы: схема и запросы

Компонент / Класс Описание
graphene.Schema(query=...) Определяет основную GraphQL-схему.
schema.execute(query_string) Выполняет GraphQL-запрос.
ObjectType Базовый класс для описания объектов.
Field(...) Описание отдельного поля в объекте.
String, Int, Boolean, List, ID Примитивные типы GraphQL.
python
import graphene class Query(graphene.ObjectType): hello = graphene.String(name=graphene.String(default_value="мир")) def resolve_hello(self, info, name): return f"Привет, {name}!" schema = graphene.Schema(query=Query) result = schema.execute('{ hello(name: "Ваня") }') print(result.data['hello']) # Привет, Ваня!

Описание типов и связей

Компонент Описание
ObjectType Класс, описывающий GraphQL-объект.
Field(Type) Поле, ссылающееся на другой объект или примитив.
List(Type) Массив объектов.
NonNull(Type) Поле, не допускающее null.
python
class User(graphene.ObjectType): id = graphene.ID() name = graphene.String() age = graphene.Int()

Резолверы (обработчики данных)

Метод Описание
resolve_<field>(self, info, **args) Метод, возвращающий данные для указанного поля.
info.context Доступ к контексту запроса (например, request, user).
info.root_value Значение, возвращаемое родительским типом.

Аргументы и параметры

Компонент Описание
String(required=True) Обязательный аргумент.
default_value=... Значение по умолчанию.
Argument(type, ...) Явное описание аргумента поля.
python
class Query(graphene.ObjectType): greet = graphene.String(name=graphene.String(required=True)) def resolve_greet(self, info, name): return f"Привет, {name}"

Мутации (изменение данных)

Компонент Описание
graphene.Mutation Класс, описывающий мутацию.
Arguments Вложенный класс для аргументов мутации.
mutate(self, info, **kwargs) Метод, выполняющий мутацию.
Field(MutationClass) Добавление мутации в схему.
python
class CreateUser(graphene.Mutation): class Arguments: name = graphene.String() ok = graphene.Boolean() user = graphene.Field(lambda: User) def mutate(self, info, name): user = User(name=name) return CreateUser(user=user, ok=True) class Mutation(graphene.ObjectType): create_user = CreateUser.Field()

Вводные типы (InputObjectType)

Класс Описание
InputObjectType Используется для передачи вложенных структур в аргументах.
python
class UserInput(graphene.InputObjectType): name = graphene.String() age = graphene.Int()

Интеграции

Библиотека Описание
graphene-django Интеграция с Django ORM, автоматическая генерация схем.
graphene-sqlalchemy Интеграция с SQLAlchemy.
flask-graphql Встраивание GraphQL в Flask.
starlette-graphene3, ariadne, strawberry Альтернативные подходы или интеграции с