带有临时文件的烧瓶 send_file

flask send_file with temporary files

如果我从临时文件包装器中删除 pdf 文件创建,我可以发送一个正确的文件,但是当我用临时文件包装时,我得到这个错误:

AttributeError: 'bytes' 对象没有属性 'read'

我试图从我的文件路径中删除 .read(),但随后我收到另一个有关尝试读取已关闭文件的错误。我在网上查看了烧瓶 send_file,似乎在 tmp 文件上使用 send_file 存在问题。有人有解决办法吗?我不想创建一个文件,然后在发送后手动删除它,我想将其保存为临时文件

with tempfile.TemporaryFile() as fp:
     PDF.dumps(fp, pdf)
     return send_file(fp.read(), attachment_filename="invoice"+str(invoice["id"])+".pdf", as_attachment=True)

使用 TemporaryFile 作为上下文管理器,文件在块结束后立即关闭。 send_file 调用不会立即读取文件 - 它只是 returns 一个对象,可以在上下文管理器关闭后稍后读取您的文件。

根据 tempfile 文档,文件句柄关闭时会清理文件,WSGI 规范 PEP 333 指定兼容的实现必须 close(),因此我们可以在没有上下文管理器:

    tmp = tempfile.TemporaryFile()
    tmp.write(b'some content')
    tmp.seek(0)
    return send_file(tmp, attachment_filename='example.txt')