摘要:在里,流式響應(yīng)是個(gè)好東西可以快速節(jié)省內(nèi)存地產(chǎn)生一個(gè)大型文件。目前項(xiàng)目里用于流式響應(yīng)的一個(gè)是,用于改善跨系統(tǒng)通訊時(shí)用戶產(chǎn)生的慢速的感覺。
在Django里,流式響應(yīng)StreamingHttpResponse是個(gè)好東西,可以快速、節(jié)省內(nèi)存地產(chǎn)生一個(gè)大型文件。
目前項(xiàng)目里用于流式響應(yīng)的一個(gè)是Eventsource,用于改善跨系統(tǒng)通訊時(shí)用戶產(chǎn)生的慢速的感覺。這個(gè)不細(xì)說(shuō)了。
還有一個(gè)就是生成一個(gè)大的csv文件。
當(dāng)Django進(jìn)程處于gunicorn或者uwsgi等web容器中時(shí),如果響應(yīng)超過一定時(shí)間沒有返回,就會(huì)被web容器終止掉,雖然我們可以通過加長(zhǎng)web容器的超時(shí)時(shí)間來(lái)繞過這個(gè)問題,但是畢竟還是治標(biāo)不治本。要根本上解決這個(gè)問題,Python的生成器、Django框架提供的StreamingHttpResponse這個(gè)流式響應(yīng)很有幫助
而在csv中,中文的處理也至關(guān)重要,要保證用excel打開csv不亂碼什么的。。為了節(jié)約空間,我就把所有代碼貼到一起了。。實(shí)際使用按照項(xiàng)目的規(guī)劃放置哈
上代碼:
pythonfrom __future__ import absolute_import import csv import codecs import cStringIO class Echo(object): def write(self, value): return value class UnicodeWriter: """ A CSV writer which will write rows to CSV file "f", which is encoded in the given encoding. """ def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): # Redirect output to a queue self.queue = cStringIO.StringIO() self.writer = csv.writer(self.queue, dialect=dialect, **kwds) self.stream = f self.encoder = codecs.getincrementalencoder(encoding)() def writerow(self, row): self.writer.writerow([handle_column(s) for s in row]) # Fetch UTF-8 output from the queue ... data = self.queue.getvalue() data = data.decode("utf-8") # ... and reencode it into the target encoding data = self.encoder.encode(data) # write to the target stream value = self.stream.write(data) # empty queue self.queue.truncate(0) return value def writerows(self, rows): for row in rows: self.writerow(row) from django.views.generic import View from django.http.response import StreamingHttpResponse class ExampleView(View): headers=["一些","表頭"] def get(self,request): result = [["第一行","數(shù)據(jù)1"], ["第二行","數(shù)據(jù)2"]] echoer = Echo() writer = UnicodeWriter(echoer) def csv_itertor(): yield codecs.BOM_UTF8 yield writer.writerow(self.headers) for column in result: yield writer.writerow(column) response = StreamingHttpResponse( (row for row in csv_itertor()), content_type="text/csv;charset=utf-8") response["Content-Disposition" ] = "attachment;filename="example.csv"" return response
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37515.html
摘要:設(shè)計(jì)風(fēng)格協(xié)議與用戶的通信協(xié)議,總是使用協(xié)議域名應(yīng)該盡量將部署在專用域名之下,如果確定很簡(jiǎn)單,不會(huì)有進(jìn)一步的擴(kuò)展,可以考慮放在主域名之下。數(shù)據(jù)庫(kù)中的表示記錄同種數(shù)據(jù)的集合,所以中的名詞也應(yīng)該使用復(fù)數(shù)。 showImg(https://segmentfault.com/img/bVbdXlE?w=1560&h=913); RESTful Api設(shè)計(jì)風(fēng)格 協(xié)議:API與用戶的通信協(xié)議,總是使...
摘要:導(dǎo)出功能在管理后臺(tái)算是比較常見的了。但是如果用來(lái)打開,超過行的數(shù)據(jù)都會(huì)看不見,這是程序的問題。本次導(dǎo)出數(shù)據(jù)量很大。原因數(shù)值顯示精度為位造成精度丟失。 導(dǎo)出功能在管理后臺(tái)算是比較常見的了。在實(shí)現(xiàn)導(dǎo)出表格類信息的功能時(shí),可以選擇兩種實(shí)現(xiàn)方式: 導(dǎo)出為excel 導(dǎo)出為csv文件格式 用csv方式導(dǎo)出,則可以像導(dǎo)出txt一樣,以文本流的方式進(jìn)行流式處理,不但能導(dǎo)出海量信息,而且流式處理占...
摘要:基于注解生成加簽驗(yàn)簽。是否寫入頭,建議第一次寫入指定,避免中文亂碼指定文件編碼默認(rèn)不進(jìn)行字段排序無(wú)待寫入的文件列表方法默認(rèn)值說(shuō)明必填創(chuàng)建實(shí)例,并且指定待讀取文件路徑。 csv 基于 java 注解生成加簽驗(yàn)簽 csv。 開源地址: github csv) 創(chuàng)作原由 以前覺得 csv 文件的多寫非常簡(jiǎn)單,就懶得封裝。 最近一個(gè)月寫了兩次 csv 文件相關(guān)的東西,發(fā)現(xiàn)要處理的細(xì)節(jié)還是有的,...
摘要:源網(wǎng)頁(yè)說(shuō)明文檔所有關(guān)于你應(yīng)該且必須知道的。性能和優(yōu)化概述的兼容性旨在兼容多種不同版本的支持的兼容性地理框架打算成為世界級(jí)的地理框架。其目標(biāo)是盡可能簡(jiǎn)單地構(gòu)建應(yīng)用程序并利用空間使能數(shù)據(jù)的功能。 源網(wǎng)頁(yè):https://docs.djangoproject.co... django說(shuō)明文檔 所有關(guān)于django你應(yīng)該且必須知道的。 第一步 你是否django編程新手,那就從此開始!從零開始...
摘要:請(qǐng)注意,我們不再明確地將我們的請(qǐng)求或響應(yīng)明確綁定到給定的內(nèi)容類型。這允許返回完全可瀏覽網(wǎng)頁(yè)的表示。中文文檔目錄中文教程序列化中文教程請(qǐng)求和響應(yīng)中文教程基于類的視圖中文教程驗(yàn)證和權(quán)限中文教程關(guān)系和超鏈接中文教程中文教程模式和客戶端庫(kù) 從這一點(diǎn)開始,我們將真正開始覆蓋REST框架的核心。我們來(lái)介紹幾個(gè)基本的構(gòu)建塊。 請(qǐng)求對(duì)象REST框架引入了Request擴(kuò)展常規(guī)的對(duì)象HttpReques...
閱讀 2586·2021-11-25 09:43
閱讀 1863·2021-09-22 15:26
閱讀 3742·2019-08-30 15:56
閱讀 1714·2019-08-30 15:55
閱讀 1899·2019-08-30 15:54
閱讀 816·2019-08-30 15:52
閱讀 3158·2019-08-29 16:23
閱讀 897·2019-08-29 12:43