Я сейчас работаю над веб-приложением в Джанго.На моей странице отправки («submission.html» с «SubmissionView») пользователи могут отправлять некоторые данные и устанавливать некоторые флажки.Все это обрабатывается (это может занять некоторое время), а затем выходная таблица отображается в файле «output.html» (с «OutputView»).
Я хотел бы получить, когда форма отправлена,пользователь перенаправляется на страницу «process.html» (с «ProcessView»), где будет виден фиктивный индикатор выполнения с javascript, просто чтобы дать пользователю знать, сколько времени потребуется для обработки данных.Когда все обработано и результаты доступны, пользователь автоматически перенаправляется в файл «output.html», где будет видна таблица результатов.
Пока мне удалось перенаправить все входные данные из request.POST из представления SubmissionView.в ProcessView все обрабатывается и снова перенаправляется в OutputView.НО!При отправке формы она просто остается на странице submission.html (с панелью загрузки под URL-адресом), а когда все обрабатывается, вывод выводится в output.html.Страница process.html никогда не отображается.
Я не могу найти, как сначала отобразить страницу process.html, в фоновом режиме выполнить анализ (в моем ProcessView) и, когда это будет сделано, показать вывод.Может ли кто-нибудь помочь, пожалуйста?
My SubmissionView:
class SubmissionView(View):
def get(self, request, *args, **kwargs):
form = UploadFileModelForm(request.POST, request.FILES)
mailform = Email()
context = {
"form":form,
"mailform": mailform,
}
return render(request, "webtool/submission.html", context)
def post(self, request, *args, **kwargs):
form = UploadFileModelForm(request.POST, request.FILES)
if form.is_valid():
instance = form.save()
#Some stuff gets done here
request.session['toprocess'] = {
"somevar": somevar,
}
return render(request, "webtool/process.html")
My ProcessView:
class ProcessView(View):
def post(self, request, *args, **kwargs):
#Some stuff gets done here
return redirect(reverse('output'))
My OutputView:
class OutputView(View):
def get(self, request, *args, **kwargs):
#some stuff gets done here
return render(request, "webtool/output.html", context)
ОБНОВЛЕНИЕ:
class SubmissionView(View):
def get(self, request, *args, **kwargs):
form = UploadFileModelForm(request.POST, request.FILES)
mailform = Email()
context = {
"form":form,
"mailform": mailform,
}
return render(request, "webtool/submission.html", context)
def post(self, request, *args, **kwargs):
form = UploadFileModelForm(request.POST, request.FILES)
if form.is_valid():
instance = form.save()
#Some stuff gets done here
request.session['toprocess'] = {
"somevar": somevar,
}
return redirect(reverse('process'))
class ProcessView(View):
def get(self, request, *args, **kwargs):
#This is what initializes the celery task
result = task.delay()
if result.ready() == False:
return redirect(reverse('process'))
elif result.ready() == True:
return render(request, "webtool/output.html")
в идеале
- 1) пользователь отправляет форму -> def post () в SubmissionView перенаправляет пользователя на process.html(ProcessView)
- 2) В process.html (def get () внутри ProcessView) асинхронная задача инициализируется с помощью celery для обработки предоставленных данных пользователя
- 3). Тем временемв файле process.html
- 4 работает фиктивная панель загрузки. 4) Когда задача сельдерея будет завершена, перенаправьте пользователя на файл output.html
Но
- Проблема с запуском асинхронности.Задача внутри ProcessView состоит в том, что он создает бесконечный цикл, потому что вы всегда возвращаетесь в функцию def get () и просто перезапускаете процесс.
- Инициализация задачи внутри SubmissionView невозможна, потому что тогда вы должныпередать переменную «result» (с сеансом) в ProcessView, и это невозможно (что приводит к следующей ошибке: объект типа «AsyncResult» не сериализуем в формате JSON)