显示Django WeasyPrint PDF Export的进度条

时间:2016-05-13 20:18:51

标签: django pdf export weasyprint

我正在使用WeasyPrint创建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

1 个答案:

答案 0 :(得分:0)

要获得确切的进展,您必须在某个网址上使用ajax调用再次点击后端。连接到url的视图当前没有连接到负责转换的主视图。因此,您必须在数据库中存储进度。 (对于2分钟的工作,这对我来说似乎毫无意义)。

除此之外,从流程中提取当前进度并存储在数据库中将是另一个令人头痛的问题。

由于您确定它的最大工作时间为2或3分钟,因此在前端脚本中创建一个javascript加载器,同时以固定的间隔(可能是20秒)命中后端以查看文件是否已创建。如果已经创建了重定向以显示pdf(或任何你想要的),那么保持正在进行的加载符号(可能在3分钟内完成)。

(我解释的所有内容都使用ajax在同一页面上发生,否则你必须使用python异步方法)

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

您可以将其扩展为使用python的线程,除非您想监视该任务,否则不需要芹菜。