Django перенаправить на просмотр для обработки, а затем на outputView - PullRequest
0 голосов
/ 04 июня 2018

Я сейчас работаю над веб-приложением в Джанго.На моей странице отправки («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)

1 Ответ

0 голосов
/ 04 июня 2018

Вы SubmissionView на самом деле не перенаправляет на ваш процесс просмотра.Это просто рендеринг шаблона Process, но только запуск метода post в SubmissionView.

Вместо этого SubmissionView.post должен будет использовать return HttpResponseRedirect для перенаправления на reverse('process').Это будет перенаправить в ProcessView.

Затем, когда будет завершена загрузка панели в ProcessView, JavaScript должен будет перенаправить в OutputView (он должен иметь доступ к вводу из SubmissionView

...