流式响应实战:用 StreamingHttpResponse 导出千万级 CSV 不爆内存
解决大文件导出时的内存爆炸问题,利用生成器与 StreamingHttpResponse 实现边生成边下载。 · 难度:入门 · +10XP
流式响应实战:用 StreamingHttpResponse 导出千万级 CSV 不爆内存
多数教程的 CSV 导出使用 HttpResponse 配合 StringIO,数据量大时内存飙升。本教程教你使用 Python 生成器(yield)配合 StreamingHttpResponse,每次只从数据库读取一行(iterator() + values_list()),逐行编码写入响应流。同时讲解如何设置正确的 Content-Type 和 Content-Disposition 让浏览器触发下载。最终效果:导出 1000 万行数据的内存占用不到 50MB。
def stream_csv(request):
def generate_rows():
yield ','.join(['name', 'email']) + '
'
for user in User.objects.all().iterator():
yield f"{user.name},{user.email}
"
response = StreamingHttpResponse(
generate_rows(), content_type='text/csv'
)
response['Content-Disposition'] = 'attachment; filename="users.csv"'
return response