Парсинг лог файла в динамике и вывод на фронт

Разрабатывается проект на Django. Установлен DRF. В ходе работы одного из процессов Backend-a генерится лог, который необходимо парсить и, выловив нужную строку, вывести на HTML страницу пользователя. Все происходит в динамике.

Вот код, который я написал. urls.py

    path('api/log-stream/', LogStreamAPIView.as_view(), name='log_stream'),

Вот часть вьюхи

class LogStreamAPIView(APIView):
    def get(self, request):
        def stream_log():
            f = subprocess.Popen(['tail', '-F', rcvenot_log], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            p = select.poll()
            p.register(f.stdout)

            while TEST_IN_PROGRESS:
                if p.poll(0.1):
                    new_line_log = f.stdout.readline().decode('utf-8').strip()
                    for target_line in RCV_SCENARIO:
                        if target_line in new_line_log:
                            yield f"event: {new_line_log}\n\n"

        return StreamingHttpResponse(stream_log(), content_type='text/event-stream')

Вот часть на стороне HTML

        <div style="width: 200px; height: 200px; overflow-y: scroll;">
            <ul id="logList"></ul>
        </div>

        <script>
            document.addEventListener("DOMContentLoaded", function() {
                var logList = document.getElementById('logList');

                function updateLog(newLine) {
                    var listItem = document.createElement('li');
                    listItem.textContent = newLine;
                    logList.appendChild(listItem);
                }

                var source = new EventSource('/api/log-stream/');
                source.onmessage = function(event) {
                    updateLog(event.data);
                };
            });
        </script>

В ходе работы при переходе на mysite.ru/api/log-stream/ я вижу, что строки выдаются, event: 2024.03.22 16:16:13:016[INFO ][Thread-0] Получено уведомление РѕР± изменениях, количество модифицированных элементов - 2

но на странице пользователя они не появляются.

Прошу помочь разобраться в чем может быть проблема.

PS Я читал что EventSource может быть "чувствителен" к формату данных и ему нужно именно в формате f"event: {new_line_log}\n\n" или f"data: {new_line_log}\n\n". Пробовал и так и так, не работает

PSS Если еще подскажите по поводу проблемы кодировки, буду благодарен. Эту проблему еще не курил.

Скриншот консоли браузера

  1. Тайна крылась в особенностях обработки запросов DRF. Вот тут описано решение stackoverflow.com/questions/78210488/…. Это решило проблему получения кода 406 и получить нормальный ответ 200.
  2. Данные необходимо передавать в формате f"data: {data}\n\n." Это требование SSE
Вернуться на верх