GraphQL 与 Graphene 简介
GraphQL 是一种现代的 API 查询语言和运行时环境,由 Facebook 于 2012 年开发,旨在解决传统 REST API 的诸多痛点。Graphene 是一个强大的 Python 库,完整实现了 GraphQL 规范,支持类型化 schema、变更操作以及与主流 ORM 系统的集成。
什么是 GraphQL?为什么需要它?
GraphQL 采用声明式数据获取方式,客户端可以精确描述所需的数据结构。与 REST 由服务端决定响应结构不同,GraphQL 让客户端自主构建查询,只获取真正需要的数据。
GraphQL 相比 REST 的核心优势
单一入口点
GraphQL 所有操作共用同一个 URL 端点,简化了 API 架构,无需通过 URL 进行版本管理。
查询灵活性
客户端自主定义响应结构,只请求必要的字段和关联数据。
消除数据冗余
过获取(获取多余数据)和欠获取(数据不足)的问题在查询层面得到解决。
关联数据聚合
一次查询即可获取多个关联实体的数据,大幅减少服务端请求次数。
强类型系统
GraphQL schema 是静态类型的,支持查询验证和 IDE 自动补全。
自动文档生成
Schema 本身就是 API 的实时文档,可通过内省机制随时查看。
安装与配置 Graphene
基础安装
pip install graphene
与 Web 框架集成
Flask 集成:
pip install flask-graphql
Django 集成:
pip install graphene-django
FastAPI 集成:
pip install starlette-graphene3
与数据库集成
SQLAlchemy 集成:
pip install graphene-sqlalchemy
Django ORM 集成:
pip install graphene-django
创建基础 GraphQL 服务端
Flask 示例
from flask import Flask
from flask_graphql import GraphQLView
import graphene
app = Flask(__name__)
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)
app.add_url_rule('/graphql', view_func=GraphQLView.as_view(
'graphql',
schema=schema,
graphiql=True # 启用 GraphiQL 交互界面
))
if __name__ == '__main__':
app.run(debug=True)
Django 示例
# settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'graphene_django',
'myapp',
]
GRAPHENE = {
'SCHEMA': 'myproject.schema.schema'
}
# urls.py
from django.urls import path
from graphene_django.views import GraphQLView
urlpatterns = [
path('graphql/', GraphQLView.as_view(graphiql=True)),
]
在 Graphene 中定义类型与 Schema
创建自定义类型
import graphene
class User(graphene.ObjectType):
id = graphene.ID()
name = graphene.String()
email = graphene.String()
age = graphene.Int()
is_active = graphene.Boolean()
# 计算字段
full_name = graphene.String()
def resolve_full_name(self, info):
return f"{self.first_name} {self.last_name}"
class Post(g