目前項(xiàng)目里用于流式響應(yīng)的一個(gè)是Eventsource,用于改善跨系統(tǒng)通訊時(shí)用戶產(chǎn)生的慢速的感覺。這個(gè)不細(xì)說了。
還有一個(gè)就是生成一個(gè)大的csv文件。
當(dāng)Django進(jìn)程處于gunicorn或者uwsgi等web容器中時(shí),如果響應(yīng)超過一定時(shí)間沒有返回,就會(huì)被web容器終止掉,雖然我們可以通過加長web容器的超時(shí)時(shí)間來繞過這個(gè)問題,但是畢竟還是治標(biāo)不治本。要根本上解決這個(gè)問題,Python的生成器、Django框架提供的StreamingHttpResponse這個(gè)流式響應(yīng)很有幫助
而在csv中,中文的處理也至關(guān)重要,要保證用excel打開csv不亂碼什么的。為了節(jié)約空間,我就把所有代碼貼到一起了。實(shí)際使用按照項(xiàng)目的規(guī)劃放置哈
上代碼:
from __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
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com