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


Posted in Python onMay 02, 2015

在Django里,流式响应StreamingHttpResponse是个好东西,可以快速、节省内存地产生一个大型文件。

目前项目里用于流式响应的一个是Eventsource,用于改善跨系统通讯时用户产生的慢速的感觉。这个不细说了。

还有一个就是生成一个大的csv文件。

当Django进程处于gunicorn或者uwsgi等web容器中时,如果响应超过一定时间没有返回,就会被web容器终止掉,虽然我们可以通过加长web容器的超时时间来绕过这个问题,但是毕竟还是治标不治本。要根本上解决这个问题,Python的生成器、Django框架提供的StreamingHttpResponse这个流式响应很有帮助

而在csv中,中文的处理也至关重要,要保证用excel打开csv不乱码什么的。。为了节约空间,我就把所有代码贴到一起了。。实际使用按照项目的规划放置哈

上代码:

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 = [['第一行','数据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

Python 相关文章推荐
Python 自动安装 Rising 杀毒软件
Apr 24 Python
python实现爬虫下载漫画示例
Feb 16 Python
python虚拟环境virtualenv的安装与使用
Sep 21 Python
Python基于pygame模块播放MP3的方法示例
Sep 30 Python
详解python的sorted函数对字典按key排序和按value排序
Aug 10 Python
Python读取txt某几列绘图的方法
Oct 14 Python
Django安装配置mysql的方法步骤
Oct 15 Python
python学习--使用QQ邮箱发送邮件代码实例
Apr 16 Python
Python3打包exe代码2种方法实例解析
Feb 17 Python
Python发送手机动态验证码代码实例
Feb 28 Python
Python函数调用追踪实现代码
Nov 27 Python
Python解析微信dat文件的方法
Nov 30 Python
详细解读Python中的__init__()方法
May 02 #Python
举例讲解Python的Tornado框架实现数据可视化的教程
May 02 #Python
Python的Bottle框架中返回静态文件和JSON对象的方法
Apr 30 #Python
使用Python编写提取日志中的中文的脚本的方法
Apr 30 #Python
简单的连接MySQL与Python的Bottle框架的方法
Apr 30 #Python
Python的Bottle框架中实现最基本的get和post的方法的教程
Apr 30 #Python
Python中使用Beautiful Soup库的超详细教程
Apr 30 #Python
You might like
C#静态方法与非静态方法实例分析
2014/09/22 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
Laravel validate error处理,ajax,json示例
2019/10/25 PHP
javascript URL编码和解码使用说明
2010/04/12 Javascript
基于jquery中children()与find()的区别介绍
2013/04/26 Javascript
Extjs实现进度条的两种便捷方式
2013/09/26 Javascript
JS中的this变量的使用介绍
2013/10/21 Javascript
Egret引擎开发指南之运行项目
2014/09/03 Javascript
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
继续学习javascript闭包
2015/12/03 Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
2016/07/05 Javascript
JavaScript实现垂直向上无缝滚动特效代码
2016/11/23 Javascript
vue.js将unix时间戳转换为自定义时间格式
2017/01/03 Javascript
ES6入门教程之Class和Module详解
2017/05/17 Javascript
javascript性能优化之分时函数的介绍
2018/03/28 Javascript
Javascript中parseInt的正确使用方式
2018/10/17 Javascript
详解ECMAScript2019/ES10新属性
2019/12/06 Javascript
python通过pil将图片转换成黑白效果的方法
2015/03/16 Python
python模拟Django框架实例
2016/05/17 Python
整理Python 常用string函数(收藏)
2016/05/30 Python
java中两个byte数组实现合并的示例
2018/05/09 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
在Tensorflow中实现leakyRelu操作详解(高效)
2020/06/30 Python
Python爬虫之Selenium实现键盘事件
2020/12/04 Python
CSS Grid布局教程之浏览器开启CSS Grid Layout汇总
2014/12/30 HTML / CSS
CSS3之transition实现下划线的示例代码
2018/05/30 HTML / CSS
新西兰航空中国官网:Air New Zealand China
2018/07/24 全球购物
联想印度官方网上商店:Lenovo India
2019/08/24 全球购物
劲霸男装广告词改编版
2014/03/21 职场文书
班主任工作经验交流材料
2014/05/13 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
社区扶贫帮困工作总结
2015/05/20 职场文书
民事代理词范文
2015/05/25 职场文书
结婚纪念日感言
2015/08/01 职场文书