如何在Graphene Python的resolver中调用自定义方法
问题解答
报错根因
你代码报错的核心问题是对Graphene根Query解析器的parent参数取值认知错误:
- 根Query类型下所有解析器的第一个参数
parent(也叫root)默认就是None,因为根节点不存在上层解析器返回的父对象,因此你调用parent.do_boring_task()自然会触发NoneType无对应属性的报错。 - 你定义的
do_boring_task是Query类的成员方法,不需要通过parent调用,有两种可直接落地的实现方案。
可行的复用实现方式
方案1:公共方法改为静态/类方法直接调用
如果你的公共方法不需要依赖Query类的实例属性,可以直接声明为静态方法,通过类名直接调用:
# 修正后代码 class Query(graphene.ObjectType): field = graphene.Field(SomeType) @staticmethod def do_boring_task(arg): return "I did something" def resolve_field(parent, info): # 直接通过类名调用静态方法 did_something = Query.do_boring_task(arg) # 此处执行其他逻辑 return resolved_fields
如果是嵌套类型的解析器,parent就是上一层解析器返回的对应类型实例,这种场景下才可以通过parent调用对应实例的方法。
方案2:抽离为独立公共工具函数
这是业内最常用的复用写法,把所有解析器都可能用到的公共逻辑抽成独立的工具函数,需要时直接调用即可:
# 抽离为独立工具方法 def do_boring_task(arg): return "I did something" class Query(graphene.ObjectType): field = graphene.Field(SomeType) def resolve_field(parent, info): did_something = do_boring_task(arg) # 此处执行其他逻辑 return resolved_fields
关于middleware的适用场景
只有当你要实现的是全局所有解析器都要执行的通用逻辑(比如全局权限校验、请求日志统计、全链路埋点)时,才适合用middleware实现。如果只是部分解析器需要复用的业务逻辑,直接抽公共方法调用即可,不需要用middleware做过度设计。
内容的提问来源于stack exchange,提问作者Andrew Jouffray
相关产品推荐
相关产品推荐

