国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Django 實現下載文件功能的示例

2020-02-22 23:22:57
字體:
來源:轉載
供稿:網友

基于Django建立的網站,如果提供文件下載功能,最簡單的方式莫過于將靜態文件交給Nginx等處理,但有些時候,由于網站本身邏輯,需要通過Django提供下載功能,如頁面數據導出功能(下載動態生成的文件)、先檢查用戶權限再下載文件等。因此,有必要研究一下文件下載功能在Django中的實現。

最簡單的文件下載功能的實現

將文件流放入HttpResponse對象即可,如:

def file_download(request):  # do something...  with open('file_name.txt') as f:    c = f.read()  return HttpResponse(c)

這種方式簡單粗暴,適合小文件的下載,但如果這個文件非常大,這種方式會占用大量的內存,甚至導致服務器崩潰

更合理的文件下載功能

Django的HttpResponse對象允許將迭代器作為傳入參數,將上面代碼中的傳入參數c換成一個迭代器,便可以將上述下載功能優化為對大小文件均適合;而Django更進一步,推薦使用 StreamingHttpResponse對象取代HttpResponse對象,StreamingHttpResponse對象用于將文件流發送給瀏覽器,與HttpResponse對象非常相似,對于文件下載功能,使用StreamingHttpResponse對象更合理。

因此,更加合理的文件下載功能,應該先寫一個迭代器,用于處理文件,然后將這個迭代器作為參數傳遞給StreaminghttpResponse對象,如:

from django.http import StreamingHttpResponsedef big_file_download(request):  # do something...   def file_iterator(file_name, chunk_size=512):    with open(file_name) as f:      while True:        c = f.read(chunk_size)        if c:          yield c        else:          break   the_file_name = "file_name.txt"  response = StreamingHttpResponse(file_iterator(the_file_name))   return response

文件下載功能再次優化

上述的代碼,已經完成了將服務器上的文件,通過文件流傳輸到瀏覽器,但文件流通常會以亂碼形式顯示到瀏覽器中,而非下載到硬盤上,因此,還要在做點優化,讓文件流寫入硬盤。優化很簡單,給StreamingHttpResponse對象的Content-Type和Content-Disposition字段賦下面的值即可,如:

response['Content-Type'] = 'application/octet-stream'response['Content-Disposition'] = 'attachment;filename="test.pdf"'

完整代碼如下:

from django.http import StreamingHttpResponsedef big_file_download(request):  # do something...   def file_iterator(file_name, chunk_size=512):    with open(file_name) as f:      while True:        c = f.read(chunk_size)        if c:          yield c        else:          break   the_file_name = "big_file.pdf"  response = StreamingHttpResponse(file_iterator(the_file_name))  response['Content-Type'] = 'application/octet-stream'  response['Content-Disposition'] = 'attachment;filename="{0}"'.format(the_file_name)   return response            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 耒阳市| 铁岭市| 原平市| 安庆市| 弥渡县| 万盛区| 阿城市| 新巴尔虎右旗| 酒泉市| 大城县| 崇州市| 留坝县| 吉隆县| 湟源县| 新兴县| 三门峡市| 卢龙县| 凯里市| 蛟河市| 敖汉旗| 景宁| 隆回县| 玉屏| 北安市| 西林县| 宝鸡市| 遵化市| 灯塔市| 莱芜市| 新乡市| 修武县| 墨江| 延边| 庆城县| 乐清市| 体育| 闵行区| 田阳县| 津市市| 松阳县| 社会|