Graphene 2.0 升级指南:Python GraphQL 框架的重大更新
前言
Graphene 是 Python 生态中广受欢迎的 GraphQL 框架,其 2.0 版本带来了多项重大改进和优化。本文将详细介绍从 1.0 升级到 2.0 版本需要注意的关键变化,帮助开发者顺利完成迁移。
核心改进概述
Graphene 2.0 对类型系统进行了大幅简化:
- 移除了
ObjectType
、Interface
、InputObjectType
、Scalar
和Enum
的显式元类需求 - 优化了字段解析器的编写方式
- 引入了多项新特性
已弃用功能
1. AbstractType 被弃用
在 1.0 版本中,需要使用 AbstractType
来实现字段共享。2.0 版本中可以直接使用普通的 Python 继承机制。
旧版写法:
class CommonFields(AbstractType):
name = String()
class Pet(CommonFields, Interface):
pass
新版写法:
class CommonFields(object):
name = String()
class Pet(CommonFields, Interface):
pass
2. resolve_only_args 装饰器被弃用
由于解析器 API 的简化,不再需要这个装饰器。
旧版写法:
class User(ObjectType):
name = String()
@resolve_only_args
def resolve_name(root):
return root.name
新版写法:
class User(ObjectType):
name = String()
def resolve_name(root, info):
return root.name
3. Mutation.Input 改为 Mutation.Arguments
Mutation 的输入参数定义方式发生了变化。
旧版写法:
class User(Mutation):
class Input:
name = String()
新版写法:
class User(Mutation):
class Arguments:
name = String()
重大变更
1. 简化的解析器 API
解析器的参数传递方式发生了重大变化:
- 参数现在作为关键字参数直接传递
context
参数被移除,改为通过info.context
访问- 参数获取方式更加直观
旧版写法:
my_field = graphene.String(my_arg=graphene.String())
def resolve_my_field(root, args, context, info):
my_arg = args.get('my_arg')
return ...
新版写法:
my_field = graphene.String(my_arg=graphene.String())
def resolve_my_field(root, info, my_arg):
return ...
对于可选参数,建议使用 **args
捕获:
def resolve_my_field(root, info, known_field1, known_field2, **args):
other_arg = args.get('optional_arg')
2. Node 连接需要显式定义
2.0 版本中,Node 类型不再自动包含 Connection,需要显式定义。
旧版写法:
class User(ObjectType):
class Meta:
interfaces = [relay.Node]
name = String()
class Query(ObjectType):
user_connection = relay.ConnectionField(User)
新版写法:
class User(ObjectType):
class Meta:
interfaces = [relay.Node]
name = String()
class UserConnection(relay.Connection):
class Meta:
node = User
class Query(ObjectType):
user_connection = relay.ConnectionField(UserConnection)
3. Node.get_node 方法签名变更
获取节点的方法参数顺序发生了变化。
旧版签名:
@classmethod
def get_node(cls, id, context, info):
新版签名:
@classmethod
def get_node(cls, info, id):
新特性
1. 改进的 InputObjectType
现在可以像普通对象一样访问输入类型的字段:
旧版写法:
user_id = input.get('id')
新版写法:
user_id = input.id
还可以在输入类型上定义属性:
class UserInput(InputObjectType):
id = ID(required=True)
@property
def is_valid(root):
return root.id.startswith('userid_')
2. Meta 选项作为类参数(仅限 Python 3)
现在可以直接在类定义中指定 Meta 选项:
旧版写法:
class Dog(ObjectType):
class Meta:
interfaces = [Pet]
name = String()
新版写法:
class Dog(ObjectType, interfaces=[Pet]):
name = String()
3. 抽象类型支持
现在可以更简单地创建抽象类型:
class Base(ObjectType):
class Meta:
abstract = True
id = ID()
def resolve_id(root, info):
return f"{root.__class__.__name__}_{root.id}"
4. 新增 UUID 标量类型
2.0 版本新增了专门的 UUID
标量类型,方便处理 UUID 数据。
升级建议
- 首先检查代码中是否使用了已弃用的功能
- 逐步更新解析器签名,注意参数顺序的变化
- 显式定义所有需要的 Connection 类型
- 利用新特性简化代码结构
- 充分测试所有变更,特别是涉及 Node 和 Mutation 的部分
通过遵循本指南,开发者可以顺利将项目迁移到 Graphene 2.0,并享受新版本带来的诸多改进和优化。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考