2010-10-27 45 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