Как выводить процесс выполнения функции на странице html — Django?

Для вывода процесса выполнения функции на странице HTML в Django, можно воспользоваться асинхронными запросами и технологией Server-Sent Events (SSE).

1. Сначала, создайте представление Django, которое будет обрабатывать асинхронные запросы и отправлять обновления в режиме реального времени. Например, у вас может быть представление с именем progress_view, которое будет обрабатывать асинхронные запросы и возвращать обновления о прогрессе выполнения вашей функции.

from django.http import JsonResponse
from django.views.decorators.http import require_GET

@require_GET
def progress_view(request):
    # Ваш код для проверки прогресса выполнения функции
    # и формирования соответствующего ответа
    
    progress = {
        'status': 'in_progress',
        'progress': 50,  # Пример данных о прогрессе выполнения
        'message': 'Выполняется функция...',
    }
    
    return JsonResponse(progress)

2. В HTML-шаблоне, в котором вы хотите отобразить прогресс выполнения, добавьте следующий скрипт:

<script>
    var eventSource = new EventSource("{% url 'progress_view' %}");
    
    eventSource.onmessage = function(event) {
        var progress = JSON.parse(event.data);
        
        if (progress.status === 'in_progress') {
            // Обновление прогресса на странице
            document.getElementById("progress").innerHTML = 'Прогресс: ' + progress.progress + '%';
            document.getElementById("message").innerHTML = progress.message;
        } else if (progress.status === 'completed') {
            // Действия, которые нужно выполнить после завершения
            // функции (например, скрыть индикатор прогресса)
            document.getElementById("progress").innerHTML = 'Выполнено!';
            document.getElementById("message").innerHTML = '';
            eventSource.close();
        }
    };
</script>

<div id="progress"></div>
<div id="message"></div>

В этом примере скрипт создает новое соединение EventSource с URL progress_view, который будет обрабатывать асинхронные запросы и отправлять обновления о прогрессе выполнения функции. Когда прогресс выполняется, скрипт обновляет элементы HTML с идентификаторами progress и message, отображая состояние выполнения функции.

3. Добавьте URL-маршрут в файл urls.py вашего Django-приложения, чтобы связать представление progress_view с URL progress/.

from django.urls import path
from .views import progress_view

urlpatterns = [
    path('progress/', progress_view, name='progress_view'),
    # ...
]

Теперь, при запуске вашего Django-приложения и переходе на соответствующую страницу, вы будете видеть вывод прогресса выполнения вашей функции в режиме реального времени. Обратите внимание, что вам необходимо обновлять данные о прогрессе в представлении progress_view в соответствии с вашей логикой выполнения функции.