Использование загрузчика данных на уровне запроса (graphene tornado-graphql)

#python #graphql #tornado #graphene-python

#python #graphql #tornado #graphene-python

Вопрос:

Я пытаюсь интегрировать GraphQL в свой веб-сервис, который был написан на tornado (python). Используя загрузчики данных, я могу ускорить свой запрос и избежать отправки нескольких запросов в мою базу данных. Но проблема в том, что я не могу найти никаких примеров или определения, которые равнялись бы переменной «context» на уровне запроса для хранения GraphQLView. Я нашел пример, написанный на sanic, см. Эту ссылку. Есть ли в «tornado» какое-либо определение, равное «context» (get_context) в sanic??? Или какие-либо примеры для разрешения подобных атрибутов:

 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):
 

Ответ №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» в графене на следующем уровне.