石墨烯:如何在查询执行之前添加函数?

问题描述

有没有办法在所有查询之前执行一个函数

当我在 Query 类上面添加注释时,它会出错

AssertionError: Type <function Query at 0x104d1dd30> is not a valid ObjectType.


def my_func(f):
    @wraps(f)
    def my_func_wrap(*args,**kwargs):
        //do something
        return f(*args,**kwargs)

    return my_func_wrap

@my_func
class Query(graphene.ObjectType):
    node = relay.Node.Field()

    users = graphene.List(lambda: UserSchema)

    def resolve_users(self,info):
        //do something
        return User.query.all()


schema = graphene.Schema(query=Query)

如果我将注释添加到每个解析器,它就可以正常工作。

但我会添加 20 多个解析器,我认为将注释添加到每个解析器并不是一个好主意。

解决方法

是的,你可以。只需创建一个继承自 GraphQLView 的自定义 View 类并覆盖 dispatch 方法,然后使用您自己的视图类作为 graphql 端点处理程序。像这样:

    class CustomGraphQLView(GraphQLView):
        def dispatch(self,request,*args,**kwargs):
            // do something
            super(CustomGraphqlView,self).dispatch(request,**kwargs)

如果您想操作查询集本身,我建议使用 graphene-django-extras 并覆盖其查询字段上的 list_resolver 方法(DjangoFilterListField,DjangoFilterPaginateListField,... ) 类并使用您自己的自定义类。

您可以在覆盖方法上调用 super 或从其源中复制确切的代码并进行编辑。