Django Graphene - передает info.context декоратору в запросе или мутации - PullRequest
0 голосов
/ 18 октября 2018

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

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

Спасибо!

Запрос

Класс запроса (объект):

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

1 Ответ

0 голосов
/ 18 октября 2018

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

Поскольку вывключая 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

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

...