Вы не можете поддерживать состояние между вызовами страниц в глобальном масштабе, поэтому вам нужно хранить свои данные в базе данных. Кроме того, представление не может согласовывать что-либо с браузером после того, как оно вернуло страницу, поэтому вам нужно разделить это на несколько представлений и создать отдельный поток для задания. Вот общий план, который может помочь:
def do_something():
my_job = Jobs.get(id=blah)
my_job.in_progress = True
my_job.save()
# Do some stuff here....
my_job.in_progress = False
my_job.save()
def step1(request):
in_progress = Jobs.get(id=blah).in_progress
if not in_progress:
if request.method == 'POST':
form = SyncJobForm(request.POST)
if form.is_valid():
thread.start_new_thread(do_something)
return HttpResponseRedirect(step2)
else:
return render_to_response('form.html', 'form': form)
else:
form = SyncJobForm()
return render_to_response('form.html', 'form': form)
else:
return HttpResponseRedirect(step2)
def step2(request):
in_progress = Jobs.get(id=blah).in_progress
if in_progress:
return render_to_response('in_progress.html')
else:
return HttpResponseRedirect(finished)
def finished(request):
return render_to_response('finished.html')
Затем пусть ваша страница in_progress.html
периодически обновляет страницу. Когда работа завершена, вы можете отобразить сообщение о состоянии в finished.html
.
Существуют более изощренные способы сделать это (напишите Javascript, чтобы периодически опрашивать сервер), но вам все равно потребуется написать отдельные представления, чтобы ответить соответствующей информацией. Кроме того, вы можете использовать инфраструктуру управления заданиями, например Celery , для создания и выполнения заданий, но вам все равно придется создавать отдельные представления для обработки информации о состоянии.