【问题标题】:Graphene: How to add a function before query execute?石墨烯:如何在查询执行之前添加一个函数?
【发布时间】:2021-07-31 11:42:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: annotations graphene-python graphene-sqlalchemy


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-03
      • 2020-07-27
      • 1970-01-01
      • 2021-12-01
      • 2020-11-30
      • 2023-04-06
      • 2018-07-08
      • 2019-01-23
      相关资源
      最近更新 更多