#jquery #django #celery #django-celery #celery-task
Вопрос:
Я создал индикатор выполнения сельдерея в своем проекте django, например, нажмите кнопку, и индикатор выполнения запустится в пользовательском интерфейсе, и он работает.После начала выполнения, когда я перехожу на заднюю страницу или следующую страницу и возвращаюсь на страницу индикатора выполнения, панель больше не отображается, однако задача сельдерея все еще выполняется в фоновом режиме. Я хочу показывать прогресс в пользовательском интерфейсе даже после переключения страниц, пока задача не будет выполнена. Пожалуйста, предложите мне, как этого добиться.Вот мой код:
views.py
def approval_req_func(request):
task = go_to_sleep.delay(3)
data = {'status': 'Success', 'message': 'Approved successfully', 'task_id':task.task_id}
return HttpResponse(json.dumps(data), content_type="application/json")
tasks.py
@app.task(bind=True)
def go_to_sleep(self,duration):
progress_recorder = ProgressRecorder(self)
s = Contact.objects.all()
for i,j in enumerate(s):
time.sleep(duration)
print(j)
progress_recorder.set_progress(i 1, len(s),f'On Iteration {i}')
return 'Done'
Html amp; Scripts
<button>Click to start Progress</button>
<div class='progress-wrapper'>
<div id='progress-bar' class='progress-bar' style="background-color: #68a9ef; width: 0%;">amp;nbsp;</div>
</div>
<div id="progress-bar-message">Waiting for progress to start...</div>
<script>
$(document).ready(function(){
$("button").click(function(event) {
event.preventDefault()
const valuesInArray = $(this).serializeArray()
const body = {}
valuesInArray.forEach(e => {
body[e.name] = e.value
});
$.ajax({
method: "GET",
url: "{% url 'contact:approval_req_func' %}",
data: body
}).done(function (response) {
$(function () {
var progressUrl = "{% url 'celery_progress:task_status' 'task-id-stub' %}";
var progressUrll = progressUrl.replace('task-id-stub', response['task_id']);
CeleryProgressBar.initProgressBar(progressUrll);
});
})
.fail(function (response) {
console.log(response);
})
});
})
</script>