是否可以使用 StreamingHttpResponse 生成 PDF,因为可以使用 CSV 生成大型数据集?

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 模板。

JPG*_*JPG 0

我遇到过类似的情况,我能够“生成并流式下载”csvjson和类型的文件,并且我想对Excelxml文件执行相同的操作。xlsx

不幸的是,我做不到。但是,那段时间我发现了一些事情

  1. CSV、JSON 和 XML 文件是具有正确表示形式的文本文件。但是,当涉及 PDF 或 Excel(或类似文件)时,这些文件是使用正确的格式和正确的元数据构建的。

  2. 只有当我们调用某些特定方法时, PDF和类似文档的二进制数据才会写入io缓冲区。[showPage()save()方法reportlab。(来源- Django 文档)]

  3. 如果我们检查文件流,PDF 和 Excel 需要复杂的特殊应用程序(例如:PDF 阅读器、Bowsers 等)来查看/读取数据,而使用 CSV 和 JSON,我们只需要一个简单的文本编辑器。

因此,我得出的结论是, “通过流下载动态生成文件”的过程(不确定我应该使用什么是正确的技术术语)并不适用于所有文件类型,而仅适用于少数面向文本的文件

注:这是我有限的经验,可能有错误。