Отправлять переменные или сообщения на страницу, пока скрипт выполняет задачи (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";
}
}
}