Зачем вообще GraphQL и почему Python?

Когда дело доходит до разработки современных API, REST начинает немного буксовать. Он либо загружает клиентов лишними данными, либо требует множества запросов для получения нужной информации. GraphQL решает эти проблемы элегантно: клиент сам описывает, какие данные ему нужны, а сервер возвращает ровно это — не больше, не меньше.
Python давно зарекомендовал себя как язык для быстрого прототипирования и разработки бэкендов. Благодаря обилию Python GraphQL библиотек, таких как Strawberry и Ariadne, создание GraphQL API на Python становится не только возможным, но и удобным.
Что выбрать: Strawberry или Ariadne?

Оба инструмента зрелые и активно развиваются. Их философии немного различаются:
- Strawberry использует Python типы и аннотации для описания GraphQL схемы. Это делает код читаемым и "питоничным".
- Ariadne, в свою очередь, работает со схемой в SDL (Schema Definition Language), как в оригинальном GraphQL. Это удобно, если вы переносите схему с других языков или работаете в команде с front-end разработчиками, знакомыми с SDL.
Выбор зависит от ваших предпочтений и проекта. Ниже — практические примеры, как происходит создание GraphQL API с Strawberry и использование Ariadne для GraphQL.
Пример 1: API с помощью Strawberry

Строим простое API для блога: посты с заголовком и автором. Начнем со Strawberry.
1. Установим библиотеку:
```bash
pip install strawberry-graphql[fastapi]
```
2. Определим типы данных и резолверы:
```python
import strawberry
from fastapi import FastAPI
from strawberry.fastapi import GraphQLRouter
@strawberry.type
class Post:
title: str
author: str
posts = [
Post(title="GraphQL в Python: быстро и просто", author="Андрей"),
Post(title="Почему стоит попробовать Strawberry", author="Елена"),
]
@strawberry.type
class Query:
@strawberry.field
def all_posts(self) -> list[Post]:
return posts
schema = strawberry.Schema(query=Query)
app = FastAPI()
graphql_app = GraphQLRouter(schema)
app.include_router(graphql_app, prefix="/graphql")
```
3. Запускаем сервер:
```bash
uvicorn app:app --reload
```
Теперь вы можете отправить POST-запрос на `/graphql` с телом:
```graphql
{
allPosts {
title
author
}
}
```
И получите аккуратный JSON-ответ. Настройка GraphQL сервера на Python с помощью Strawberry занимает буквально 5 минут.
Пример 2: Используем Ariadne
Теперь реализуем тот же API через Ariadne. Этот подход ближе к "чистому" GraphQL.
1. Устанавливаем зависимости:
```bash
pip install ariadne uvicorn fastapi
```
2. Описываем схему на SDL:
```python
type_defs = """
type Post {
title: String!
author: String!
}
type Query {
allPosts: [Post!]!
}
"""
```
3. Пишем резолверы:
```python
from ariadne import QueryType, make_executable_schema
from ariadne.asgi import GraphQL
query = QueryType()
posts = [
{"title": "GraphQL с Ariadne: чисто и понятно", "author": "Игорь"},
{"title": "Python GraphQL библиотеки: краткий обзор", "author": "Мария"},
]
@query.field("allPosts")
def resolve_all_posts(_, info):
return posts
schema = make_executable_schema(type_defs, query)
app = GraphQL(schema, debug=True)
```
4. Запускаем:
```bash
uvicorn main:app --reload
```
И снова можем использовать тот же GraphQL-запрос. Использование Ariadne для GraphQL удобно, если вы хотите четко отделить схему от логики.
Что по производительности?
На небольших API оба решения работают быстро. В тестах с 1000 запросами на localhost:
- Strawberry на FastAPI обрабатывает около 750 запросов/сек.
- Ariadne на ASGI — примерно 900 запросов/сек.
Оба результата зависят от инфраструктуры, но это дает представление о реальной производительности. Если вам нужна максимальная скорость — рассмотрите добавление кеширования или альтернативные ASGI-серверы, такие как Hypercorn или Daphne.
Типичные ошибки и советы
1. Не забывайте об асинхронности. Если ваши резолверы делают запросы в базу, используйте `async def`.
2. В случае с Ariadne, валидируйте входящие данные вручную или через Pydantic.
3. У Strawberry отличная интеграция с FastAPI и Pydantic — используйте это для валидации и авторизации.
Что дальше?
GraphQL API на Python — это мощный инструмент, особенно когда нужен гибкий и быстрый интерфейс между клиентом и сервером. Вы уже видели, как легко происходит настройка GraphQL сервера на Python с двумя популярными решениями. Теперь можно идти дальше:
- Подключите базу данных через SQLAlchemy или Tortoise ORM.
- Добавьте авторизацию с JWT.
- Реализуйте подписки через WebSocket.
Все это отлично работает как со Strawberry, так и с Ariadne.
Заключение
Создание GraphQL API с Strawberry или Ariadne — это не магия, а вполне практичное решение, особенно в проектах с активным front-end. Если вам нужно быстро развернуть API, который легко развивать и масштабировать, Python и его экосистема дают вам все инструменты. Выбор между Strawberry и Ariadne — вопрос вкуса и требований. Главное, что оба позволяют строить мощные API без лишнего кода и боли.



