Django Graphene-将info.context传递给查询或变异的装饰器

时间:2018-10-18 00:49:49

标签: django graphene-python

我试图将Query中的resolve函数传递给自定义装饰器。当** kwargs被传递给decorator函数时,好像info对象没有被传递。当我尝试在装饰器中读取信息时,我得到的值为无。没有装饰器,我就可以直接在resolve函数中读取info对象。

请注意,下面显示的装饰器是用于读取info对象的测试代码,不能用于任何其他目的。我了解django / graphene框架中提供了已定义的装饰器,但是我想了解如何针对自定义代码将info对象正确地传递给装饰器。

谢谢!

查询

类查询(对象):

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 :(得分: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

很难说出其中哪一部分是相关的,因为您的示例并没有真正弄清楚代码的实际外观和结果,但是应该使您处于正确的轨道。