在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实用技巧两则
Aug 29 Python
简单介绍Python中的filter和lambda函数的使用
Apr 07 Python
django通过ajax发起请求返回JSON格式数据的方法
Jun 04 Python
在Django的模型中添加自定义方法的示例
Jul 21 Python
Python在图片中添加文字的两种方法
Apr 29 Python
Python爬虫获取图片并下载保存至本地的实例
Jun 01 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
Jun 24 Python
使用pip安装python库的多种方式
Jul 31 Python
Python基础之高级变量类型实例详解
Jan 03 Python
python json load json 数据后出现乱序的解决方案
Feb 27 Python
Python Tkinter实例——模拟掷骰子
Oct 24 Python
asyncio异步编程之Task对象详解
Mar 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/01/13 PHP
使用PHP求两个文件的相对路径
2013/06/20 PHP
详解PHP的Yii框架的运行机制及其路由功能
2016/03/17 PHP
BOOM vs RR BO5 第三场 2.14
2021/03/10 DOTA
javascript编程起步(第一课)
2007/01/10 Javascript
23个Javascript弹出窗口特效整理
2011/02/25 Javascript
一些常用弹出窗口/拖放/异步文件上传等实用代码
2013/01/06 Javascript
JS 去除Array中的null值示例代码
2013/11/20 Javascript
用html5 js实现点击一个按钮达到浏览器全屏效果
2014/05/28 Javascript
在JavaScript中构建ArrayList示例代码
2014/09/17 Javascript
Javascript动画效果(4)
2016/10/11 Javascript
JS中动态创建元素的三种方法总结(推荐)
2016/10/20 Javascript
angularjs实现上拉加载和下拉刷新数据功能
2017/06/12 Javascript
js获取html页面代码中图片地址的实现代码
2018/03/05 Javascript
在vue组件中使用axios的方法
2018/03/16 Javascript
vue自定义指令和动态路由实现权限控制
2020/08/28 Javascript
ES6中的Javascript解构的实现
2020/10/30 Javascript
vue3.0中setup使用(两种用法)
2020/12/02 Vue.js
python正则表达式的使用
2017/06/12 Python
python 接口返回的json字符串实例
2018/03/27 Python
如何在Python中实现goto语句的方法
2019/05/18 Python
对django中foreignkey的简单使用详解
2019/07/28 Python
Python实现二叉搜索树BST的方法示例
2019/07/30 Python
Python实现把类当做字典来访问
2019/12/16 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
Pycharm编辑器功能之代码折叠效果的实现代码
2020/10/15 Python
使用数据结构给女朋友写个Html5走迷宫游戏
2019/11/26 HTML / CSS
全球性的在线婚纱礼服工厂:27dress.com
2019/03/21 全球购物
大学生咖啡店创业计划书
2014/01/21 职场文书
仓库规划计划书
2014/04/28 职场文书
销售员岗位职责
2014/06/09 职场文书
毕业证代领委托书
2014/09/26 职场文书
乡镇防汛工作汇报
2014/10/28 职场文书
小学语文继续教育研修日志
2015/11/13 职场文书
学习习近平主席讲话心得体会
2016/01/20 职场文书
Java Lambda表达式常用的函数式接口
2022/04/07 Java/Android