Graphene Django如何为响应对象添加extensions字段
在Graphene中添加自定义extensions字段的解决方案
问题原因
你遇到的问题本质是:Graphene的ExecutionResult对象在序列化返回响应时,需要确保extensions属性被正确初始化且不为空;同时直接修改result.data不符合GraphQL规范,容易引发Schema验证问题。另外,print(result)看不到extensions是因为对象的__repr__方法未包含该属性,但实际响应中可能已经存在,建议直接查看API返回的JSON内容确认。
方案一:正确重写视图方法(基础实现)
确保extensions属性被正确初始化,避免因初始值为None导致序列化时被忽略:
class CustomGraphQLView(GraphQLView): def execute_graphql_request(self, request, *args, **kwargs): result = super().execute_graphql_request(request, *args, **kwargs) # 初始化extensions(兼容部分旧版本Graphene的默认值) if not hasattr(result, 'extensions') or result.extensions is None: result.extensions = {} # 添加自定义扩展数据 result.extensions['a'] = 'b' # 注意:禁止直接修改result.data,正确做法见下方解析器示例 return result
方案二:通过Schema解析器添加数据(替代直接修改result.data)
直接修改result.data绕过了GraphQL的Schema验证,属于不规范操作。正确的做法是在Schema中定义字段,通过解析器返回数据:
from graphene import ObjectType, String, Field class ViewerType(ObjectType): test = String() # 定义你的其他字段... def resolve_test(self, info): # 在这里返回自定义数据 return 'blah' class Query(ObjectType): viewer = Field(ViewerType) def resolve_viewer(self, info): return ViewerType()
方案三:使用中间件实现(更优解,解耦代码)
通过Graphene中间件添加扩展数据,无需重写视图方法,代码更模块化:
class CustomExtensionsMiddleware: def resolve(self, next, root, info, **args): # 执行解析逻辑 result = next(root, info, **args) # 向context中注入扩展数据 if not hasattr(info.context, 'extensions'): info.context.extensions = {} info.context.extensions['a'] = 'b' return result
然后在视图中关联中间件并传递扩展数据到ExecutionResult:
class CustomGraphQLView(GraphQLView): def get_graphql_params(self, request): params = super().get_graphql_params(request) # 初始化context中的extensions容器 params['context']['extensions'] = {} return params def execute_graphql_request(self, request, *args, **kwargs): result = super().execute_graphql_request(request, *args, **kwargs) # 将context中的扩展数据赋值给result result.extensions = kwargs['context']['extensions'] return result
最后在配置GraphQL视图时添加中间件:
urlpatterns = [ path('graphql/', CustomGraphQLView.as_view( schema=schema, middleware=[CustomExtensionsMiddleware()] )), ]
额外注意事项
- 若使用旧版本
graphene-django,请升级到最新版本,确保ExecutionResult.to_dict()方法会自动包含非空的extensions字段。 - 测试时不要依赖
print(result)的输出,应直接查看API返回的JSON响应内容,确认extensions字段是否存在。
内容的提问来源于stack exchange,提问作者MDalt
相关产品推荐
相关产品推荐

