在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实用代码片段收集贴
Jun 03 Python
Python字符串拼接、截取及替换方法总结分析
Apr 13 Python
Python编程中装饰器的使用示例解析
Jun 20 Python
Python中的pygal安装和绘制直方图代码分享
Dec 08 Python
Python pymongo模块用法示例
Mar 31 Python
pandas 数据实现行间计算的方法
Jun 08 Python
浅述python中深浅拷贝原理
Sep 18 Python
python for循环输入一个矩阵的实例
Nov 14 Python
python networkx 包绘制复杂网络关系图的实现
Jul 10 Python
pip install python 快速安装模块的教程图解
Oct 08 Python
PyQt5实现画布小程序
May 30 Python
python基础入门之普通操作与函数(三)
Jun 13 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
PHP性能优化 产生高度优化代码
2011/07/22 PHP
深入解析php中的foreach问题
2013/06/30 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
2016/01/08 PHP
文本框的字数限制功能jquery插件
2009/11/24 Javascript
Extjs 几个方法的讨论
2010/01/28 Javascript
JQuery中SetTimeOut传参问题探讨
2013/05/10 Javascript
jQuery.holdReady()使用方法
2014/05/20 Javascript
.NET微信公众号开发之创建自定义菜单
2015/07/16 Javascript
vue 如何添加全局函数或全局变量以及单页面的title设置总结
2017/06/01 Javascript
JavaScript之promise_动力节点Java学院整理
2017/07/03 Javascript
ES6扩展运算符的用途实例详解
2017/08/20 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
vue2.0页面前进刷新回退不刷新的实现方法
2018/07/31 Javascript
Vue中axios拦截器如何单独配置token
2019/12/27 Javascript
python获取外网ip地址的方法总结
2015/07/02 Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
2016/04/11 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
python 生成图形验证码的方法示例
2018/11/11 Python
python pandas模块基础学习详解
2019/07/03 Python
Python中的上下文管理器相关知识详解
2019/09/19 Python
python元组的概念知识点
2019/11/19 Python
python检查目录文件权限并修改目录文件权限的操作
2020/03/11 Python
Python如何爬取b站热门视频并导入Excel
2020/08/10 Python
意大利和国际最佳时尚品牌:Drestige
2019/12/28 全球购物
资产经营总监岗位职责
2013/12/04 职场文书
家长评语大全
2014/01/22 职场文书
班主任工作经验材料
2014/02/02 职场文书
公安机关查摆剖析材料
2014/10/10 职场文书
2014个人年度工作总结
2014/12/15 职场文书
JavaScript实现复选框全选功能
2021/04/11 Javascript
python爬虫请求库httpx和parsel解析库的使用测评
2021/05/10 Python
Canvas如何做个雪花屏版404的实现
2021/09/25 HTML / CSS
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript
深入理解 Golang 的字符串
2022/05/04 Golang
Android Canvas绘制文字横纵向对齐
2022/06/05 Java/Android