Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以使用StreamingHttpResponse生成PDF,因为它是';对于大型数据集,是否可以使用CSV?_Python_Django_Large Data_Streaminghttpresponse - Fatal编程技术网

Python 是否可以使用StreamingHttpResponse生成PDF,因为它是';对于大型数据集,是否可以使用CSV?

Python 是否可以使用StreamingHttpResponse生成PDF,因为它是';对于大型数据集,是否可以使用CSV?,python,django,large-data,streaminghttpresponse,Python,Django,Large Data,Streaminghttpresponse,我有一个大的数据集,我必须生成CSV和PDF。对于CSV,我使用以下指南: 它工作得很好。然而,我找不到任何可以为PDF做的事情。可以吗?我使用render_to_pdf以及pdf模板。我有一个类似的情况,我可以“生成并流式下载”csv、json和xml类型的文件,我想用Excel-xlsx文件做同样的事情 不幸的是,我不能那样做。但是,在那段时间里,我发现了一些东西 文件、CSV、JSON和XML是具有适当表示形式的文本文件。但是,当涉及到PDF或Excel(或类似文件)时,这些文件是使用适当

我有一个大的数据集,我必须生成CSV和PDF。对于CSV,我使用以下指南:


它工作得很好。然而,我找不到任何可以为PDF做的事情。可以吗?我使用
render_to_pdf
以及pdf模板。

我有一个类似的情况,我可以“生成并流式下载”csv、
json
xml
类型的文件,我想用Excel-
xlsx
文件做同样的事情

不幸的是,我不能那样做。但是,在那段时间里,我发现了一些东西

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

  • 只有在调用某些特定方法时,才会将PDF和类似文档的二进制数据写入io缓冲区。[
    showPage()
    save()
    方法的
    reportlab
    (源-)

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

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

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

    你试过了吗

    类似的东西应该会起作用,基本上你可以在以下网站上找到:


    查看您提供的链接,它确实提供了一个链接,指向使用动态创建和发送pdf文件的页面

    导入io
    从django.http导入文件响应
    从reportlab.pdfgen导入画布
    定义某些视图(请求):
    #创建一个类似文件的缓冲区来接收PDF数据。
    buffer=io.BytesIO()
    #创建PDF对象,使用缓冲区作为其“文件”
    p=canvas.canvas(缓冲区)
    #在PDF上画东西。这里是生成PDF的地方。
    #有关功能的完整列表,请参阅ReportLab文档。
    p、 抽绳(100100,“你好,世界。”)
    #干净地关闭PDF对象,我们就完成了。
    p、 showPage()
    p、 保存()
    #FileResponse设置内容处置标头,以便浏览器
    #显示保存文件的选项。
    buffer.seek(0)
    返回FileResponse(缓冲区,如_attachment=True,filename='hello.pdf')
    

    这里是文档的链接。它有点长,而且存储在一个恼人的单页pdf中,但它应该可以让您启动并运行,并且能够很好地按照您的需要格式化pdf。

    将CSV视为一种水果沙拉。你可以在一个大锅里切香蕉,加一些葡萄柚,一些菠萝。。。然后将整个文件拆分为单独的部分,并将其合并到表中(即:生成CSV文件,然后将其发送到客户端)。但是你也可以直接做一些单独的部分:在一个小碗里切一些香蕉片,加入一些葡萄柚,一些菠萝。。。将这个小碗放到桌上,并对其他单独的部分重复此过程(即:生成CSV文件,并在生成文件时将其逐部分发送给客户端)

    如果CSV是水果沙拉,那么PDF是蛋糕。你必须把所有的配料混合在一起放进烤箱。这意味着在你烤完整个蛋糕之前,你不能把一片蛋糕带到桌上。同样,在完全生成PDF文件之前,您无法开始将其发送到客户端

    因此,为了回答您的问题,这个(
    response=StreamingHttpResponse((writer.writerow(row)表示行中的行),content\u type=“text/csv”)
    )不能用于PDF

    但是,一旦生成了文件,就可以使用其他答案中提到的方法将其流式传输到客户端

    如果您的问题是生成PDF需要花费太多时间(例如,可能会触发超时错误),请考虑以下几点:

  • 尝试优化生成算法的速度
  • 在客户端请求之前在后台生成文件,并将其存储在存储系统中。您可能希望使用cronjob或在不阻塞HTTP请求的情况下触发PDF的生成
  • 一旦文件准备好下载,就使用WebSocket将其发送到客户端(请参阅)

  • 你试过FileResponse吗?这样想。如果需要,CSV可以有多张图纸。它是可编辑的。其中,PDF格式无法修改。PDF是一个大文档,没有任何工作表。我尝试了这个片段来生成一个大的PDF,比如说
    .drawString(…)
    方法的100k迭代,下载没有在
    p.save()
    执行之前开始。是的,必须在流媒体开始之前创建PDF。
    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
    
    import io
    from django.http import FileResponse
    from reportlab.pdfgen import canvas
    
    def stream_pdf(request):
        buffer = io.BytesIO()
        p = canvas.Canvas(buffer)
        p.drawString(10, 10, "Hello world.")
        p.showPage()
        p.save()
        buffer.seek(io.SEEK_SET)
        return FileResponse(buffer, as_attachment=True, filename='helloworld.pdf')