基于Graphene的GraphQL:不执行查询获取Resolver名称/路径的方法咨询
不执行查询获取GraphQL Resolver的方案
一、基于Graphene的静态分析方案
Graphene的Schema对象本身存储了完整的类型定义与Resolver映射关系,无需执行查询,通过解析Query AST并结合Schema元数据就能定位对应Resolver。
1. 解析Query为抽象语法树(AST)
借助graphql-core库的parse函数,将查询字符串转换为AST:
from graphql import parse query_str = """ query GetUser($id: ID!) { user(id: $id) { name email } } """ ast = parse(query_str)
2. 遍历AST提取字段路径
遍历AST的selection_set节点,提取完整的字段层级路径,比如user、user.name、user.email。
3. 从Schema中直接获取Resolver
通过Graphene生成的Schema对象,逐层定位字段对应的Resolver:
from graphene import ObjectType, String, ID, Schema class User(ObjectType): name = String() email = String() def resolve_name(parent, info): return parent["name"] def resolve_email(parent, info): return parent["email"] class Query(ObjectType): user = User.Field(id=ID(required=True)) def resolve_user(parent, info, id): return {"id": id, "name": "Alice", "email": "alice@example.com"} schema = Schema(query=Query) # 获取根字段user的Resolver query_type = schema.type_map["Query"] user_field = query_type.fields["user"] user_resolver_name = user_field.resolver.__name__ # 输出:resolve_user # 获取嵌套字段name的Resolver user_type = schema.type_map["User"] name_field = user_type.fields["name"] name_resolver_name = name_field.resolver.__name__ # 输出:resolve_name
该方法全程为静态分析,不会触发任何Resolver的执行逻辑。
二、非Graphene的通用方案
如果不想依赖Graphene内部实现,可通过通用GraphQL工具链或静态代码分析实现需求:
1. 基于graphql-core的通用Schema校验与推断
用graphql-core的validate函数校验Query与Schema的合法性,提取字段路径后,结合项目Resolver的命名规范(比如Graphene默认的resolve_<字段名>规则)直接推断Resolver名称:
from graphql import validate, parse # 校验查询合法性 is_valid = validate(schema, parse(query_str)) if not is_valid: # 处理查询不合法场景 pass # 提取字段路径后,按命名规范推断Resolver # 例如字段user对应resolve_user,嵌套字段name对应resolve_name
2. 结合Schema文件的静态代码扫描
若项目有独立的schema.graphql文件,可使用静态代码分析工具(如astroid)扫描项目代码,匹配resolve_前缀的函数与Schema中字段的对应关系,实现Resolver路径的映射。
内容的提问来源于stack exchange,提问作者DilLip_Chowdary
相关产品推荐
相关产品推荐

