【问题标题】:Outputting PDF with Django as attachment and reload使用 Django 输出 PDF 作为附件并重新加载
【发布时间】:2011-05-01 03:19:59
【问题描述】:

我正在使用 django 生成 pdf 并将响应作为附件返回到视图中。

response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=somefilename.pdf'

类似于文档(http://docs.djangoproject.com/en/dev/howto/outputting-pdf/#write-your-view)中描述的方式

重新加载页面的最佳方式是什么?

这没有成功(表单触发了 pdf 生成):

$('#the_form').submit(function(){
  location.reload();
});

非常感谢, 丹尼

【问题讨论】:

    标签: django pdf-generation reload


    【解决方案1】:

    不要重新加载。而是创建一个作为表单目标的视图。视图在从真实 Web 服务器传递的目录中生成 PDF,然后将用户发送到相应的 URL,他可以在其中下载文件(使用 HttpResponseRedirect)。

    【讨论】:

    • 谢谢马丁。这是一个很好的选择。是否仍然可以将 PDF 作为附件返回?
    • 我决定实施 Martin 建议的方法。谢谢。
    【解决方案2】:

    只需将表单目标设置为生成 pdf 的视图。下面我介绍了这种方法与 Martin 建议的方法(将文件写入世界可以读取的目录)的一些优缺点

    优点:

    • 您可以进行身份​​验证或特殊计费或其他任何操作
    • 每个请求都会生成一个新的 PDF(除非您明确缓存它)

    缺点:

    • 每个请求都会生成一个新的 PDF
    • 内存使用情况
    • 您必须从 Django 流式传输文件

    --

    另一种解决方案是使用网络服务器的 X-SendFile 标头。谷歌搜索你的特定服务器的说明。一般的想法是,您的视图为网络服务器提供了一个文件路径,然后网络服务器将直接从磁盘读取该文件并返回给用户。您甚至可以“强制下载”这些文件,请查看您的网络服务器的文档以了解如何执行此操作。

    【讨论】:

    • 我将表单目标发送到生成 pdf 的视图并获取附件作为响应。 def some_view(request): response = HttpResponse(mimetype='application/pdf') response['Content-Disposition'] = 'attachment; filename=somefilename.pdf' ... return response 但是返回响应后页面不会重新加载。
    • 啊哈。我知道了。好吧,当您使用 javascript 在表单提交上做一些事情时,它将在表单实际提交之前运行,因此您不能在那里进行任何重新加载或重定向。我能想到的最简单的解决方案是在提交处理程序中调用 window.setTimeout(function() { window.location = '/your/url/' }, timeout_in_milliseconds) ,但这确实是一个相当丑陋的黑客攻击。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2018-10-04
    • 2017-06-16
    • 1970-01-01
    相关资源
    最近更新 更多