You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:17:29