Как решить проблему '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'
}

Надеюсь, это может решить вашу проблему, так как это сработало со мной

Вернуться на верх