graphene icon indicating copy to clipboard operation
graphene copied to clipboard

FragmentSpread' object has no attribute 'selection_set' with custom Middleware

Open CAPSLOCKFURY opened this issue 4 years ago • 0 comments

Hello, I am using custom middleware to mesure complexity of graphql query, but it throws an error FragmentSpread' object has no attribute 'selection_set' with custom Middleware when using fragments. Query example

query{
  getProfile(id:1){
	...test
  }
}

fragment test on ProfileType{
  id
}

The middleware

from graphql.backend.core import GraphQLCoreBackend

def measure_depth(selection_set, level=1):
    current_depth = level
    for field in selection_set.selections:
        if field.selection_set:
            new_depth = measure_depth(field.selection_set, level=level + 1)
            if new_depth > current_depth:
                current_depth = new_depth
            if new_depth > 3:
                raise Exception('Query is too nested')
    return current_depth


class DepthAnalysisBackend(GraphQLCoreBackend):
    def document_from_string(self, schema, document_string):
        document = super().document_from_string(schema, document_string)
        ast = document.document_ast
        for definition in ast.definitions:
            if len(definition.selection_set.selections) > 1:
                raise Exception("Query is too complex")
            measure_depth(definition.selection_set)                

        return document

How to fix this, and what Fragments use instead of selection_set

CAPSLOCKFURY avatar Jul 28 '21 12:07 CAPSLOCKFURY