在请求级别使用 Dataloader (graphene + tornado-graphql)
Using Dataloader at request level (graphene + tornado-graphql)
我正在尝试将 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):
最后,我可以在请求级别访问和修改上下文,我想分享一下我是如何做到的。我可以在 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”访问dataloader了
我正在尝试将 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):
最后,我可以在请求级别访问和修改上下文,我想分享一下我是如何做到的。我可以在 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”访问dataloader了