Django Graphene - передает info.context декоратору в запросе или мутации

Я пытаюсь передать функцию разрешения в запросе пользовательскому декоратору. Хотя ** kwargs передаются функции декоратора, похоже, что информационный объект не передается. Когда я пытаюсь прочитать информацию в декораторе, я получаю значение None. Без декоратора я могу читать информационный объект непосредственно в функции разрешения.

Обратите внимание, что декоратор, показанный ниже, представляет собой тестовый код для чтения информационного объекта и не служит никакой другой цели. Я понимаю, что в структуре django / graphene есть определенные декораторы, но я хотел бы понять, как правильно передать информационный объект декоратору для пользовательского кода.

Спасибо!

Запрос

класс Query (объект):

all_users = graphene.List(UserNode)
all_roles = graphene.List(UserRoleNode)

@authenticate_role
def resolve_all_users(self,info,*args,**kwargs):
    return User.objects.all()

Декоратор

def authenticate_role(func):
   def wrap(info, *args, **kwargs):
      print (info)
      print(kwargs.get('id'))
      auth_header = info.context.META.get('HTTP_AUTHORIZATION')
      print (auth_header)
   return wrap

person Srini    schedule 18.10.2018    source источник


Ответы (1)


После изменения кода примера, чтобы он работал без внешних зависимостей (и фактически обертывал функцию), мне кажется, что ваши аргументы во время выполнения могут просто не соответствовать вашим ожиданиям.

Поскольку вы включаете self, это похоже на метод; из-за этого self будет первым аргументом, переданным вашей оболочке, которая, похоже, ожидает, что это будет info.

def authenticate_role(func):
    def wrap(*args, **kwargs):
        print(args)
        print(kwargs)
        return func(*args, **kwargs)
    return wrap

class Test(object):
    @authenticate_role
    def resolve_all_users(self, info, *args, **kwargs):
        print("In r_a_u:", info)

Test().resolve_all_users("info", "ar", "gs", a="b", c="d")
# (<__main__.Test object at 0x...>, 'info', 'ar', 'gs')
# {'c': 'd', 'a': 'b'}
# In r_a_u: info

Трудно сказать, какая часть этого должна быть актуальной, поскольку ваш пример на самом деле не дает понять, как на самом деле выглядит ваш код и каковы ваши результаты, но он должен направить вас на правильный путь.

person kungphu    schedule 18.10.2018