【发布时间】: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