0

我正在使用 Wea​​syPrint 创建 PDF。PDF 可以轻松达到 120 多页,并且最多需要 2 分钟才能呈现。发生这种情况时,页面看起来冻结并且没有响应。我正在研究 Celery,但在我到达那里之前,我想实现一个进度条:

完美解决方案: 以某种方式获取 PDF 导出的当前状态并将其显示在进度条中

可接受的解决方案:显示一个移动的进度条,告诉用户可能需要两分钟,直到 PDF 显示在浏览器显示中/自行下载。

有任何想法吗?谢谢!

当前views.py:

def course_view(request):
    students = Student.objects.filter(student_courseid__course_accid = request.user.userprofile.course_accid)

    html_template = get_template('student/student_pdf_all.html')
    rendered_html = html_template.render({'student': students}, request)
    pdf_file = HTML(string=rendered_html, base_url=request.build_absolute_uri()).write_pdf(stylesheets=[CSS(settings.STATIC_ROOT +  '/css/pdf.css')])

    http_response = HttpResponse(pdf_file, content_type='application/pdf')
    filename = str(request.user.userprofile.course_accid) + ".pdf"

    http_response['Content-Disposition'] = 'filename="{}"'.format(filename)

    return http_response
4

1 回答 1

0

要获得确切的进展,您必须在某个 url 上使用 ajax 调用一次又一次地访问后端。连接到 url 的视图当然不会连接到负责转换的主视图。因此,您必须将进度存储在数据库中。(对于 2 分钟的工作,这对我来说似乎毫无意义)。

最重要的是,从流程中提取当前进度并将其存储在数据库中将是另一个令人头疼的问题。

由于您确定它最多只能完成 2 或 3 分钟的工作,因此请在前端脚本中创建一个 javascript 加载程序,同时以固定的时间间隔(可能 20 秒)点击后端以查看文件是否已创建。如果已创建重定向以显示 pdf(或您想要的任何内容),则保持正在进行的加载标志(可能在 3 分钟内完成)。

(我要解释的一切都发生在使用 ajax 的同一页面上,否则您将不得不使用 python 异步方法)

当用户提交 pdf 请求时,调用视图(通过 ajax)创建 pdf 并启动前面提到的加载程序。

您可以扩展它以使用 python 的线程,并且不需要 celery,除非您想监视该任务。

于 2016-05-13T22:14:03.623 回答