Ich kann zwar Text erstellen und streamen, aber eine komprimierte Datei nicht im laufenden Betrieb erstellen und streamen.Komprimierte Datei mit Flask generieren und streamen
from flask import Flask, request, Response,stream_with_context
import zlib
import gzip
app = Flask(__name__)
def generate_text():
for x in xrange(10000):
yield "this is my line: {}\n".format(x)
@app.route('/stream_text')
def stream_text():
response = Response(stream_with_context(generate_text()))
return response
def generate_zip():
for x in xrange(10000):
yield zlib.compress("this is my line: {}\n".format(x))
@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)
als mit curl und gunzip:
curl http://127.0.0.1:8000/stream_zip > data.gz
gunzip data.gz
gunzip: data.gz: not in gzip format
ist mir egal, ob es zip, gzip, oder jede andere Art von Kompression ist.
generate_text
in meinem realen Code generiert über 4 GB Daten, so würde ich gerne im laufenden Betrieb komprimieren.
Speichern von Text in Datei, zippen, ZIP-Datei zurückgeben, und dann löschen ist nicht die Lösung, nach der ich bin.
Ich muss in einer Schleife sein, einige Text generieren -> diesen Text komprimieren -> komprimierte Daten streamen, bis ich fertig bin.
zip/gzip ... alles ist in Ordnung, solange es funktioniert.
Ich denke, dass, da zlib.compress eine Zeichenfolge zurückgibt, Sie nicht einen tatsächlichen gzip Bytecode senden. –
@DrorHilman: Dies ist Python 2, also sind sowohl gzip-Daten als auch rohe zlib-komprimierte Daten Strings. Aber ja, du kannst gzip nicht benutzen, um rohe zlib-Daten direkt zu dekomprimieren, zumindest nicht ohne Hacker (siehe [Wie entpacke ich zlib-Daten in UNIX?] (// unix.stackexchange.com/q/22834)). –