graphql-python / graphql-python/graphene

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

Abierto
#1,354 0 comentarios 0 reacciones 0 asignados Ver en GitHub
🐛 bug
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

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.