Как решить проблему 'NoneType' объект не имеет атрибута 'fields' в Graphene-django
Имеют эту мутацию
class AddStudentMutation(graphene.Mutation):
class Arguments:
input = StudentInputType()
student = graphene.Field(StudentType)
@classmethod
@staff_member_required
def mutate(cls, root, info, input):
try:
_student = Student.objects.create(**input)
except IntegrityError:
raise Exception("Student already created")
return AddStudentMutation(student=_student)
Перед выполнением вышеуказанной мутации в graphiql я добавляю заголовок запроса "Authorization": "JWT <token>", чтобы пользователь был авторизован.
Но я получаю ошибку graphql.error.located_error.GraphQLLocatedError: 'NoneType' object has no attribute 'fields'.
Ошибка не возникает, когда я удаляю заголовок. Он также работает нормально, когда я включаю его в запросы для запросов. Может быть, я делаю что-то не так? Мне нужно, чтобы авторизация происходила и для мутаций
Я отследил трассировку, и она ведет к файлу .../site-packages\graphql_jwt\middleware.py. Похоже это ошибка в пакете в функции allow_any() строка 18 field = info.schema.get_type(operation_name).fields.get(info.field_name). Я новичок, мне нужна помощь.
Я использую graphene-django==2.15.0 и django-graphql-jwt==0.3.4
Функция allow_any, которая поставляется вместе с django-graphql-jwt, ожидает, что она будет использоваться с запросами, а не с мутациями. Поэтому вы можете перезаписать функцию allow_any, добавив родной блок try/except:
def allow_any(info, **kwargs):
try:
operation_name = get_operation_name(info.operation.operation).title()
operation_type = info.schema.get_type(operation_name)
if hasattr(operation_type, 'fields'):
field = operation_type.fields.get(info.field_name)
if field is None:
return False
else:
return False
graphene_type = getattr(field.type, "graphene_type", None)
return graphene_type is not None and issubclass(
graphene_type, tuple(jwt_settings.JWT_ALLOW_ANY_CLASSES)
)
except Exception as e:
return False
и в вашей settings.py вы должны добавить путь перезаписанной allow_any функции:
GRAPHQL_JWT = {
'JWT_ALLOW_ANY_HANDLER': 'path.to.middleware.allow_any'
}
Надеюсь, это может решить вашу проблему, так как это сработало со мной