【问题标题】:Using Dataloader at request level (graphene + tornado-graphql)在请求级别使用 Dataloader (graphene + tornado-graphql)
【发布时间】:2021-05-05 07:35:22
【问题描述】:

我正在尝试将 GraphQL 集成到我用 tornado (python) 编写的 Web 服务中。通过使用数据加载器,我可以加快我的请求并避免向我的数据库发送多个查询。但问题是我找不到任何示例或定义等于请求级别的“上下文”变量来存储 GraphQLView。我找到了一个用 sanic refer to this link 编写的示例。 “龙卷风”中是否有任何定义等于 sanic 中的“上下文”(get_context)?或任何解决此类属性的示例:

class Bandwidth(ObjectType):
    class Meta:
        interfaces = (Service, )
    min_inbits_value = Field(Point)
    max_inbits_value = Field(Point)
    def resolve_min_inbits_value(context, resolve_info, arg1, arg2):

【问题讨论】:

    标签: python graphql tornado graphene-python


    【解决方案1】:

    最后,我可以在请求级别访问和修改上下文,我想分享一下我是如何做到的。我可以在 TornadoGraphQLHandler 中包装上下文属性,但我需要解析原始查询:

    from graphene_tornado import tornado_graphql_handler
    from graphql import parse
    class TornadoGraphQLHandler(tornado_graphql_handler.TornadoGraphQLHandler):
        @property
        def context(self):
            data = self.parse_body()
            query, variables, operation_name, id = self.get_graphql_params(self.request, data)
            try:
                document = parse(query)
                args = dict()
                for member in document.definitions[0].selection_set.selections[0].arguments:
                    args[member.name.value] = member.value.value
                return <dataloaders with the arguments in request here>
            except:
                return self.request
    

    通过这种方式,我可以在下一层石墨烯中通过“info.context”访问数据加载器。

    【讨论】:

      猜你喜欢
      • 2017-08-29
      • 2019-08-15
      • 1970-01-01
      • 2020-12-14
      • 2021-05-02
      • 2020-01-19
      • 2019-02-26
      • 2020-07-10
      • 1970-01-01
      相关资源
      最近更新 更多