from flask import Flask
from flask import Response
from flask import stream_with_context
from io import StringIO
import csv
# 测试数据
data = [
['Jack','jack@abc.com'],
['Ben','ben@abc.com'],
['jerry','jerry@abc.com']
]
@app.route('/api/exportEmails', methods=['GET'])
def exportEmails():
# 定义一个生成器 (generate),逐行生成,实现流式传输
def generate():
# 用 StringIO 在内存中写,不会生成实际文件
io = StringIO() #在 io 中写 csv
w = csv.writer(io)
for i in data: #对于 data 中的每一条
w.writerow(i) #传入的是一个数组 ['xxx','xxx@xxx.xxx'] csv.writer 会把它处理成逗号分隔的一行
#需要注意的是传入仅一个字符串 '' 时,会被逐字符分割,所以要写成 ['xxx'] 的形式
yield io.getvalue() #返回写入的值
io.seek(0) #io流的指针回到起点
io.truncate(0) #删去指针之后的部分,即清空所有写入的内容,准备下一行的写入
# 用 generate() 构造返回值
response = Response(stream_with_context(generate()), mimetype='text/csv')
# 设置Headers: Content-Disposition: attachment 表示默认会直接下载。 指定 filename。
response.headers.set("Content-Disposition","attachment",filename="emails.csv")
# 将 response 返回
return response
Python Flask 后端动态生成 csv 文件并返回
最新推荐文章于 2023-08-24 20:15:00 发布
该博客展示了如何利用Flask框架创建一个API接口,该接口能够以CSV格式流式传输数据。通过内存中的StringIO对象和csv模块,实现了在不生成实际文件的情况下,将数据逐行写入并返回给客户端进行下载。这个例子中,数据是一个包含姓名和电子邮件的列表,并设置了Content-Disposition头来触发浏览器的下载行为。
摘要由CSDN通过智能技术生成