我能够动态生成并流式传输文本,但无法动态生成并流式传输压缩文件。
from flask import Flask, request, Response,stream_with_context
import zlib
import gzip
app = Flask(__name__)
def generate_text():
for x in range(10000):
yield f"this is my line: {x}\n".encode()
@app.route('/stream_text')
def stream_text():
response = Response(stream_with_context(generate_text()))
return response
def generate_zip():
for x in range(10000):
yield zlib.compress(f"this is my line: {x}\n".encode())
@app.route('/stream_zip')
def stream_zip():
response = Response(stream_with_context(generate_zip()), mimetype='application/zip')
response.headers['Content-Disposition'] = 'attachment; filename=data.gz'
return response
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000, debug=True)
不如使用curl和gunzip:
curl http://127.0.0.1:8000/stream_zip > data.gz
gunzip data.gz
gunzip: data.gz: not in gzip format
无论是zip、gzip还是其他类型的压缩格式,我都不在意。
我的真实代码中generate_text
会生成超过4GB的数据,因此我希望能够即时压缩。
将文本保存到文件中,进行压缩,返回压缩文件,然后再删除文件并不是我想要的解决方案。
我需要在循环中生成一些文本——压缩这些文本——流式传输已压缩的数据,直到完成。
zip/gzip任何一种都可以,只要能用就行。