【问题标题】:Django redirect to view for processing and then to outputViewDjango 重定向到视图进行处理,然后到 outputView
【发布时间】:2018-11-13 23:16:32
【问题描述】:

我目前正在 Django 中开发一个 webapp。在我的提交页面(“submission.html”和“SubmissionView”)上,用户可以提交一些数据并选择一些复选框。这一切都会得到处理(这可能需要一些时间),然后在“output.html”中显示一个输出表(带有“OutputView”)。

我想得到的是,当提交表单时,用户会被重定向到一个“process.html”页面(带有“ProcessView”),其中一个带有 javascript 的虚拟进度条将可见,只是为了让用户知道处理数据需要多长时间。当所有内容都处理完毕并且结果可用时,用户会自动重定向到结果表可见的“output.html”。

到目前为止,我设法将所有来自 request.POST 的输入从 SubmissionView 重定向到 ProcessView,一切都得到处理并再次重定向到 OutputView。但!提交表单时,它只停留在 submit.html 页面上(在 url 下方有加载栏),当一切处理完毕后,输出将显示在 output.html 中。 process.html 页面永远不会显示。

我找不到如何首先显示 process.html 页面,在后台运行分析(在我的 ProcessView 中),完成后显示输出。有人可以帮忙吗?

我的提交视图:

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")

我的进程视图:

class ProcessView(View):
    def post(self, request, *args, **kwargs):

        #Some stuff gets done here

        return redirect(reverse('output'))

我的输出视图:

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) 用户提交表单 -> SubmissionView 中的 def post() 将用户重定向到 process.html (ProcessView)
  • 2)在process.html中(ProcessView里面的def get())用celery初始化一个异步任务,处理用户提交的数据
  • 3) 同时,在 process.html 中运行了一个虚拟加载栏
  • 4) celery 任务完成后,将用户重定向到 output.html

但是

  • 启动异步的问题。 ProcessView 中的任务是它会创建一个无限循环,因为您总是返回 def get() 函数并重新启动该进程。
  • 无法在 SubmissionView 中初始化任务,因为您必须将变量“result”(带有会话)传递给 ProcessView,这是不可能的(这会产生以下错误:“AsyncResult 类型的对象” ' 不是 JSON 可序列化的)

【问题讨论】:

    标签: python django python-3.x celery django-celery


    【解决方案1】:

    您的 SubmissionView 实际上并没有重定向到您的流程视图。它只是渲染 Process 模板,但只在 SubmissionView 中运行 post 方法。

    相反,SubmissionView.post 必须使用 return HttpResponseRedirect 重定向到 reverse('process')。这将重定向到 ProcessView。

    然后,当 ProcessView 上的加载栏完成时,javascript 将不得不重定向到 OutputView(它必须有权访问来自 SubmissionView 的输入

    【讨论】:

    • 它完全按照你所说的方式重定向,但它仍然没有显示 process.html 页面,只是跳过它直接从提交页面转到我的输出页面(等待发生时在提交页面)。我是否需要先渲染我的 process.html 页面,然后再进行计算?
    • 发布您的 html 和 java 脚本。加载情况如何?
    • 我没有任何 javascript,但我只有一个带有标题的基本 html 页面。我只想让它首先工作,他首先加载 process.html 页面,当他完成后转到 output.html。我发现我应该使用 Celery 并运行异步任务来做到这一点?
    • 哦,好吧,你正在使用 Celery。我从未使用过它,但我可以尝试提供帮助。能发个html吗?
    • 我在 UPDATE 中添加了所有内容 :) (+理想情况下)
    猜你喜欢
    • 2010-12-31
    • 2014-09-12
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    相关资源
    最近更新 更多