2010-10-27 42 views
1

我使用django生成pdf并在视图中将附件返回给应答。用Django输出PDF作为附件并重新加载

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

类似于DOC (http://docs.djangoproject.com/en/dev/howto/outputting-pdf/#write-your-view

什么是重新加载页面的最佳方式所描述的方法是什么?

这didn't锻炼(形式触发PDF生成):

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

非常感谢, 丹尼

回答

1

不要重装。相反,创建一个视图,它是表单的目标。该视图在从真实Web服务器传送的目录中生成PDF,然后将用户发送到适当的URL,在那里他可以下载文件(使用HttpResponseRedirect)。

+0

谢谢马丁。这是一个很好的选择。是否仍可以将PDF作为附件返回? – 2010-10-27 07:15:26

+0

我决定实施Martin提出的方法。 谢谢。 – 2010-10-27 13:59:18

0

只需将窗体目标设置为生成pdf的视图即可。下面我就包括了这种方法VS马丁提议的做法有些利弊(将文件写入到一个目录世界可以读取)

优点:

  • 你可以做认证或特殊计费或任何
  • 每个请求都将产生一个新的PDF(除非你明确其缓存)

缺点:

  • 每个请求都将产生一个新的PDF
  • 内存使用
  • 你必须从Django的
  • 流的文件

-

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

+0

我将表单目标发送到生成PDF的视图并获取附件作为响应。 def some_view(request): response = HttpResponse(mimetype='application/pdf') response['Content-Disposition'] = 'attachment; filename=somefilename.pdf' \t ... return response 但是,返回响应后页面不会重新加载。 – 2010-10-27 07:40:24

+0

啊哈。我懂了。那么,当你用表单提交javascript的东西时,它会在表单实际提交之前运行,所以你不能在那里重新加载或重定向。我能想到的最简单的解决方案是在提交处理程序中调用window.setTimeout(function(){window.location ='/ your/url /'},timeout_in_milliseconds),但它确实是一个相当丑陋的黑客攻击。 – knutin 2010-10-27 08:00:09