@Dima163

Искривлённый вывод в файле json?

При отправлении запроса в Insomnia я получаю такой вывод:

{
"id": 264,
"name": "ifconfig",
"output": "\nНастройка протокола IP для Windows\n\n\nАдаптер Ethernet Ethernet 4:\n\n Состояние среды. . . . . . . . : Среда передачи недоступна.\n DNS-суффикс подключения . . . . . : \n\nАдаптер Ethernet Hamachi:\n\n DNS-суффикс подключения . . . . . : \n IPv6-адрес. . . . . . . . . . . . : censered\n Локальный IPv6-адрес канала . . . : censered\n IPv4-адрес. . . . . . . . . . . . : censered\n Маска подсети . . . . . . . . . . : censered\n Основной шлюз. . . . . . . . . : censered\n\nАдаптер Ethernet Ethernet 3:\n\n DNS-суффикс подключения . . . . . : \n Локальный IPv6-адрес канала . . . : censered\n IPv4-адрес. . . . . . . . . . . . : censered\n Маска подсети . . . . . . . . . . : 255.255.255.0\n Основной шлюз. . . . . . . . . : censered\n\nТуннельный адаптер Teredo Tunneling Pseudo-Interface:\n\n DNS-суффикс подключения . . . . . : \n IPv6-адрес. . . . . . . . . . . . : censered\n Локальный IPv6-адрес канала . . . : censered\n Основной шлюз. . . . . . . . . : "
}

Почему-то не переносится строка, что уже только не пробовал

Вот код views:
class IfconfigViewSet(viewsets.ModelViewSet):
    queryset = Ifconfig.objects.all()       # Содержание всех записей в модели Ifconfig
    serializer_class = IfconfigSerializer   # Указание сериализатора

    # Определяет метод create, который вызывается,
    # когда пользователь отправляет POST-запрос к API-конечной точке,
    # управляемой этим ViewSet.
    def create(self, request, *args, **kwargs):
        # Получение команды из запроса
        command = request.data.get('command')
        # Определение операционной системы, чтобы выполнить Linux-команду
        system = platform.system()
        # Выполнение команды
        if command == 'ifconfig':
            if system == 'Windows':
                process = subprocess.Popen(['ipconfig'], stdout=subprocess.PIPE)
            else:
                process = subprocess.Popen(['ifconfig'], stdout=subprocess.PIPE)
            # Ждет завершения подпроцесса и возвращает его стандартный вывод в переменную output.
            output, _ = process.communicate()
            # Декодирует вывод подпроцесса в строку Юникод.
            output = output.decode('cp866')
            #output = codecs.decode(output, 'raw_unicode_escape')
            #output = output.decode('latin-1', errors='ignore')
            #output = output.encode('utf-8', errors='ignore')
            output = output.replace('\r\n', '\n')
            output = '\n'.join(output.splitlines())
            #output_json = json.dumps(output, indent=4, ensure_ascii=False)
            # Сохранение результата в базе данных
            ifconfig_instance = Ifconfig.objects.create(name=command, output=output)
            # Сериализация и возврат результата
            serializer = IfconfigSerializer(ifconfig_instance)
            # Возвращает HTTP-ответ со статусом HTTP_201_CREATED (Создано)
            # и сериализованными данными объекта ifconfig_instance.
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            # Если команда не равна ifconfig, возвращается HTTP-ответ со статусом HTTP_400_BAD_REQUEST (Неверный запрос)
            # и сообщением об ошибке.
            return Response({'error': 'Неверная команда'}, status=status.HTTP_400_BAD_REQUEST)


Код serializators:
class IfconfigSerializer(serializers.ModelSerializer):
    class Meta:
        model = Ifconfig     # Указать модель, с которой работает данный сериализатор
        fields = '__all__'   # По умолчанию включать все поля из модели Ifconfig


Код models:

class Ifconfig(models.Model):
    name = models.CharField(max_length=255)  # Название команды
    output = models.TextField()  # Поле для результата выполнения команды


Подскажите пожалуйста как решить, уже долго мучаюсь
  • Вопрос задан
  • 128 просмотров
Пригласить эксперта
Ответы на вопрос 3
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Всё у вас тут нормально кроме неправильных ожиданий. У вас сериализатор выдаёт валидный json, причем с форматированием, а не одной строкой. Ничего другого вы от него не получите. Если вам нужен какой-то другой вывод где-то, то делайте для этого другой сериализатор, или делайте шаблон и рендерите его с этими данными в контексте в текст или html.
Вы запросили json и получили его. Какой есть, такой и получили. Другого нет. Чего вы ждёте от него?
Ответ написан
Комментировать
@Everything_is_bad
Почему-то не переносится строка
что значит не переноситься? '\n' это и есть перенос, в json нет других визуальных переносов строк. И вообще "перенос строк" это про вывод данных.
Ответ написан
@SIROJA04
Конечно он переносится не будет ведь у тебя отображается объект а не стринг(если вывести в консоли res.output твой задум должен заработать).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы