萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 編程語言綜合 >> 在Python的Django框架中用流響應生成CSV文件的教程

在Python的Django框架中用流響應生成CSV文件的教程

   這篇文章主要介紹了在Python的Django框架中用流響應生成CSV文件的教程,作者特別講到了防止CSV文件中的中文避免出現亂碼等問題,需要的朋友可以參考下

  在Django裡,流式響應StreamingHttpResponse是個好東西,可以快速、節省內存地產生一個大型文件。

  目前項目裡用於流式響應的一個是Eventsource,用於改善跨系統通訊時用戶產生的慢速的感覺。這個不細說了。

  還有一個就是生成一個大的csv文件。

  當Django進程處於gunicorn或者uwsgi等web容器中時,如果響應超過一定時間沒有返回,就會被web容器終止掉,雖然我們可以通過加長web容器的超時時間來繞過這個問題,但是畢竟還是治標不治本。要根本上解決這個問題,Python的生成器、Django框架提供的StreamingHttpResponse這個流式響應很有幫助

  而在csv中,中文的處理也至關重要,要保證用excel打開csv不亂碼什麼的。。為了節約空間,我就把所有代碼貼到一起了。。實際使用按照項目的規劃放置哈

  上代碼:

  ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 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)

  ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 from django.views.generic import View from django.http.response import StreamingHttpResponse   class ExampleView(View): headers=['一些','表頭'] def get(self,request): result = [['第一行','數據1'], ['第二行','數據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

        注< >:更多精彩教程請關注三聯編程

copyright © 萬盛學電腦網 all rights reserved