goo*_*ing 13 python django large-data streaminghttpresponse
我有一个大型数据集,我必须为其生成 CSV 和 PDF。对于 CSV,我使用本指南:https : //docs.djangoproject.com/en/3.1/howto/outputting-csv/
import csv
from django.http import StreamingHttpResponse
class Echo:
"""An object that implements just the write method of the file-like
interface.
"""
def write(self, value):
"""Write the value by returning it, instead of storing in a buffer."""
return value
def some_streaming_csv_view(request):
"""A view that streams a large CSV file."""
# Generate a sequence of rows. The range is based on the maximum number of
# rows that can be handled by a single sheet in most spreadsheet
# applications.
rows = (["Row {}".format(idx), str(idx)] for idx in range(65536))
pseudo_buffer = Echo()
writer = csv.writer(pseudo_buffer)
response = StreamingHttpResponse((writer.writerow(row) for row in rows),
content_type="text/csv")
response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'
return response
Run Code Online (Sandbox Code Playgroud)
它工作得很好。但是,我找不到可以为 PDF 做的任何事情。它可以?我使用render_to_pdf
以及使用 PDF 模板。
我遇到过类似的情况,我能够“生成并流式下载”csv
、json
和类型的文件,并且我想对Excelxml
文件执行相同的操作。xlsx
不幸的是,我做不到。但是,那段时间我发现了一些事情
CSV、JSON 和 XML 文件是具有正确表示形式的文本文件。但是,当涉及 PDF 或 Excel(或类似文件)时,这些文件是使用正确的格式和正确的元数据构建的。
只有当我们调用某些特定方法时, PDF和类似文档的二进制数据才会写入io缓冲区。[showPage()
和save()
方法reportlab
。(来源- Django 文档)]
如果我们检查文件流,PDF 和 Excel 需要复杂的特殊应用程序(例如:PDF 阅读器、Bowsers 等)来查看/读取数据,而使用 CSV 和 JSON,我们只需要一个简单的文本编辑器。
因此,我得出的结论是, “通过流下载动态生成文件”的过程(不确定我应该使用什么是正确的技术术语)并不适用于所有文件类型,而仅适用于少数面向文本的文件
注:这是我有限的经验,可能有错误。