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

Django Graphene - Pass info.context to a decorator on a Query or a Mutation

我正在尝试将查询中的解析函数传递给自定义装饰器。虽然 **kwargs 被传递给装饰器函数,但信息对象似乎没有被传递。当我尝试读取装饰器中的信息时,我得到了 None 的值。没有装饰器,我可以直接在 resolve 函数中读取信息对象。

请注意,下面显示的装饰器是读取信息对象的测试代码,不用于任何其他目的。我知道 django/graphene 框架中有定义的装饰器可用,但我想了解如何将信息对象正确传递给装饰器,以用于自定义代码。

谢谢!

查询

class 查询(对象):

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

修改您的示例代码后,它将 运行 没有外部依赖性(并实际包装函数),在我看来,您在 运行 时间的论点可能不是您想要的期待。

由于您包含 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

很难说哪一部分应该相关,因为您的示例并没有真正说明您的代码实际是什么样子以及您的结果是什么,但它应该让您走上正轨。