Отправлять переменные или сообщения на страницу, пока скрипт выполняет задачи (django 4)

Я делаю некий скрипт на питоне с django, и когда пользователь отправляет файл, я обрабатываю его и выполняю кучу задач, это может длиться несколько минут. Пока пользователь ждет, у меня есть экран загрузки в js, и я печатаю в консоли то, что происходит. Но я хотел бы вывести это на странице, на экране загрузки, есть ли простой способ сделать это?

моя модель выглядит так

models.py
def main():
    #all the long stuff & logic

и мое мнение :

views.py
def upload(request):
    #some other stuff
    MyModel.main()
    return render(request,
        'frontend/upload.html',{
            'form':form,
        }
    )

Пользователю (и мне) может быть неприятно ждать и не знать, что происходит, я бы хотел использовать свою страницу, как я использую консоль с print, потому что я еще не закончил с тем, что нужно сделать, и я предполагаю, что это может длиться несколько долгих минут.

Вы пытаетесь получить информацию о состоянии запущенных задач.

Я бы сделал таблицу базы данных, содержащую токен, название задачи и колонку прогрессии.

В эту таблицу должна поступать информация из вашей основной функции.

Вы можете предоставить токен пользователю, когда он загружает файл, а затем периодически вызывать представление django из вашего JS.

Это представление вернет текущую задачу и статус на основе предоставленного вами токена.

В вашей функции загрузки :

def upload():
    #some other stuff
    token = uuid4.randomUUID()
    MyModel.main(token)
    return render(request,
        'frontend/upload.html',{
            'form':form,
            'token':token,
        }
    )

и в вашей главной функции :

def main(token):
    current_task = Task.objects.get(id=token)
    try:
        # some task
        current_task.name = "next_operation"
        current_task.status = "running"
    except:
        current_task.status = "failed"
    finally:
        current_task.save()
        

Это также обеспечит ведение журналов.

Затем нужно создать представление, возвращающее задачу и ее статус, когда вы передаете ему токен, и отобразить все, что оно возвращает.

Представление, предоставляющее детали задачи :

def upload_status_view(request):
    token = request.GET.get("token")
    if token is None:
        return HttpResponse(status=404)
    task = Task.objects.get(id=token)
    json = '{"task": "' + task.name + '", "status": "' + task.status + '"}'
    return HttpResponse(status=200, content=json)

А во front-end вы можете использовать некоторый javascript для вызова представления статуса загрузки и обновления страницы :

while(condition) {
    url = "https://myserver.com/task/status?token=MY_TOKEN";
    fetch(url).then((response) => {
        if(response.status === 200) {
            response.json().then((data) => {
                document.getElementById("myDiv").innerHTML = data["task"] + " : " + data["status"];
            });
        }
        else if (response.status === 404) {
            document.getElementById("myDiv").innerHTML = "task not found";
        }
    }
}
Вернуться на верх