Verileri csv.writer
ve stream the response ile oluşturun. Bir ara dosya oluşturmak yerine bir bellek içi arabelleğe yazmak için StringIO kullanın.
Aşağıda, bunun nasıl yapılacağının kısa bir örneği verilmiştir.
import csv
from datetime import datetime
from cstringio import StringIO
from flask import Flask, stream_with_context
from werkzeug.datastructures import Headers
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)
# add a filename
headers = Headers()
headers.set('Content-Disposition', 'attachment', filename='log.csv')
# stream the response as the data is generated
return Response(
stream_with_context(generate()),
mimetype='text/csv', headers=headers
)
app.run()
'response.headers ['Content-Disposition'] = 'attachment; filename = "download.csv" ''da çalışır. –
@ DaveW.Smith headers.add' ve ['headers.set'] hakkında güzel bir şey (http://werkzeug.pocoo.org/docs/0.11/datastructures/#werkzeug.datastructures.Headers.set) Benzersiz bir dosya adı oluşturabilir ve Werkzeug, başlığı sizin için doğru şekilde biçimlendirir. Öğeleri doğrudan ayarlayabilmeniz, "başlıklar" ın "dict" alt sınıfı olmasının yalnızca bir yan etkisidir, ancak üstbilgilerle çalışmak için en iyi yol değildir. – davidism