首页 > 解决方案 > 石墨烯:如何在查询执行之前添加一个函数?

问题描述

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

当我在查询类上方添加注释时,会出错

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 多个解析器,我认为向每个解析器添加注释并不是一个好主意。

标签: annotationsgraphene-pythongraphene-sqlalchemy

解决方案


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

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

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

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


推荐阅读