我试图将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
答案 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
很难说出其中哪一部分是相关的,因为您的示例并没有真正弄清楚代码的实际外观和结果,但是应该使您处于正确的轨道。