HttpResponse對象將會將響應的數據做爲一個總體返回,此時若是數據量很是大的話,長時間瀏覽器沒有獲得服務器的響應,就會超過默認的超時時間,返回超時。而StreamingHttpResponse會將響應的數據做爲一個數據流返回給瀏覽器,這樣瀏覽器就能夠接收到服務器發送過來的數據,不會由於長期沒有獲得服務器的迴應而返回超時。
StreamingHttpResponse:
這個類是專門用來處理流數據的,使得在處理一些大型文件的時候,不會由於服務器處理時間過長而鏈接超時。這個類並非繼承HttpResponse,而是繼承HttpResponseBase,而且跟HttpResponse對比有如下幾點區別:
(1)這個類沒有一個屬性content,相反是streaming_content。
(2)這個類的streaming_content必須是一個能夠迭代的對象。
(3)這個類沒有write方法,若是給這個類的對象寫入數據將會報錯。
注意:StreamingHttpResponse會啓動一個進程類和客戶端保持長鏈接,因此會很消耗資源,因此若是不是特殊要求,儘可能少用這種方法。
==1.使用StreamingHttpResponse生成大型csv文件而且下載,在瀏覽器中進行訪問的時候,要注意觀察瀏覽器的左下角的加載,或者說是進行安全鏈接的時間以及下載的時間,示例代碼以下:==
from django.http import HttpResponse, StreamingHttpResponse
from django.template import loader
# 定義一個類Echo,實現write方法
class Echo:
def write(self, value):
return value
def large_csv(request):
# 獲得一個StreamingHttpResponse對象,而且設置文件的類型爲csv
response = StreamingHttpResponse(content_type='text/csv')
# 不顯示文件的內容,只是能夠進行下載,而且設置文件的名字
response['Content-Disposition'] = "attachment; filename=large_csv.csv"
# 由於StreamingHttpResponse對象傳遞的第一個參數必須是能夠迭代的對象
# ()中使用for ... in ...進行遍歷,咱們就能夠獲得一個生成器同樣的對象,生成器並不會把數據一次性的返回
rows = ("row {},{}\n".format(row,row) for row in range(0,10000000))
# 使用format()函數將後面的(row,row)與字符串中的{}進行替換
response.streaming_content = rows
return response
==2.使用HttpResponse獲取大型的csv文件並進行下載,必定要注意觀察瀏覽器左下角文件在加載是的安全鏈接時間以及下載的時間,示例代碼以下:==
from django.http import HttpResponse
import csv
def large_view(request):
# 初始化
response = HttpResponse(content_type='text/csv')
# 指定文件不顯示文件內容,能夠做爲附件進行下載,而且指定文件名
response['Content-Disposition'] = "attachment; filename=large_csc.csv"
<!--使用python內置的csv模塊中的write()方法向response對象寫入數據-->
writer = csv.writer(response)
for row in range(0,10000000):
writer.writerow(['row {}'.format(row),'row'.format(row)])
return response