graphql-python / graphql-python/graphene
FragmentSpread' object has no attribute 'selection_set' with custom Middleware
- Lenguaje dominante
- Python
- Estrellas
- 8.2k
- Forks
- 818
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Descripción
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
```python
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
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Línea de trabajo
The failure occurs in the custom DepthAnalysisBackend.document_from_string traversal shown in the report; start by inspecting the AST nodes in document.document_ast, including FragmentSpread and the fragment definition. Confirm the supplied fragment query completes without the attribute error and that the depth check still behaves as intended.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- graphql, python
- Área
- api, backend
- Tipo de issue
- Error
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 42/100