Flask返回CSV时遇TypeError: Expected bytes错误的解决方法
问题解决:TypeError: Expected bytes 处理方案
问题原因
- 循环逻辑错误:你的循环
for row in result: data = row会不断覆盖data变量,最终仅保留数据库返回的最后一行数据,丢失了所有前置行。 - 数据格式不匹配:返回
text/csv类型的Response时,要求传入CSV格式的字节数据,但你直接传入了数据库返回的行对象(通常是元组或自定义数据类型),不符合字节类型要求,因此触发TypeError。
修复方案
使用Python内置的csv模块将数据库数据转换为标准CSV格式,再编码为字节后传入Response。以下是完整修正代码:
import csv from io import StringIO # 确保已导入Response及数据库连接相关模块 cursor = connection.cursor() cursor.execute("select * from table") result = cursor.fetchall() # 可选:获取数据库表字段名作为CSV表头 headers = [desc[0] for desc in cursor.description] connection.close() # 内存中生成CSV内容 output_buffer = StringIO() csv_writer = csv.writer(output_buffer) # 写入表头(不需要的话可删除此行) csv_writer.writerow(headers) # 批量写入所有数据行 csv_writer.writerows(result) # 将CSV字符串编码为字节 csv_bytes = output_buffer.getvalue().encode('utf-8') return Response( csv_bytes, mimetype="text/csv", headers={ "Content-disposition": "attachment; filename=data.csv" }, )
关键修改说明
- 用
csv.writerows(result)替代循环赋值,一次性写入所有数据行,避免数据丢失。 - 借助
StringIO在内存中生成CSV格式字符串,再通过encode('utf-8')转换为字节流,满足Response对数据类型的要求。 - 可选通过
cursor.description获取表字段名作为CSV表头,提升导出文件的可读性。
内容的提问来源于stack exchange,提问作者Jim Macaulay
相关产品推荐
相关产品推荐

