Ich versuche dem Benutzer zu erlauben, eine CSV-Datei mit Daten herunterzuladen, die durch ihre Aktionen definiert sind. Die Datei existiert nicht, sie wird dynamisch erstellt. Wie kann ich das in Flask machen?
Generieren Sie die Daten mit csv.writer
und streamen Sie die Antwort . Verwenden Sie StringIO , um in einen speicherinternen Puffer zu schreiben, anstatt eine Zwischendatei zu generieren.
import csv
from datetime import datetime
from io import StringIO
from flask import Flask
from werkzeug.wrappers import Response
app = Flask(__name__)
# example data, this could come from wherever you are storing logs
log = [
('login', datetime(2015, 1, 10, 5, 30)),
('deposit', datetime(2015, 1, 10, 5, 35)),
('order', datetime(2015, 1, 10, 5, 50)),
('withdraw', datetime(2015, 1, 10, 6, 10)),
('logout', datetime(2015, 1, 10, 6, 15))
]
@app.route('/')
def download_log():
def generate():
data = StringIO()
w = csv.writer(data)
# write header
w.writerow(('action', 'timestamp'))
yield data.getvalue()
data.seek(0)
data.truncate(0)
# write each log item
for item in log:
w.writerow((
item[0],
item[1].isoformat() # format datetime as string
))
yield data.getvalue()
data.seek(0)
data.truncate(0)
# stream the response as the data is generated
response = Response(generate(), mimetype='text/csv')
# add a filename
response.headers.set("Content-Disposition", "attachment", filename="log.csv")
return response
Wenn die generate
Funktion Informationen aus der aktuellen Funktion benötigt request
, sollte sie mit dekoriert werden stream_with_context
. Andernfalls wird der Fehler "Arbeiten außerhalb des Anforderungskontexts" angezeigt. Alles andere bleibt gleich.
from flask import stream_with context
@stream_with_context
def generate():
...
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen