【问题标题】:Show Progress Bar for Django WeasyPrint PDF Export显示 Django WeasyPrint PDF 导出的进度条
【发布时间】:2016-09-10 03:59:52
【问题描述】:

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

【问题讨论】:

    标签: django pdf export weasyprint


    【解决方案1】:

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

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

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

    (我正在解释的所有内容都使用 ajax 在同一页面上进行,否则您将不得不使用 python 异步方法)

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

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

    【讨论】:

    • 感谢您的回复!您能否指出一些解释“命中后端”的资源?我目前不知道该怎么做。
    • 抱歉,我说的是后端,我的意思是对一个 url 进行 ajax 调用。你可以找到很多例子(django with ajax)。
    猜你喜欢
    • 2016-12-23
    • 1970-01-01
    • 2017-04-15
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 2023-03-10
    相关资源
    最近更新 更多