csv.writer
और stream the response के साथ डेटा जेनरेट करें। इंटरमीडिएट फ़ाइल उत्पन्न करने के बजाय इन-मेमोरी बफर को लिखने के लिए का उपयोग करें।
निम्नलिखित यह करने का एक छोटा उदाहरण निम्नलिखित है।
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()
'प्रतिक्रिया.हेडर ['सामग्री-विस्थापन'] = 'लगाव; फ़ाइल नाम = "download.csv" '' भी काम करता है। –
@ डेव डब्ल्यू। 'हेडर.एड' और ['हेडर.सेट'] के बारे में अच्छी बात है (http://werkzeug.pocoo.org/docs/0.11/datastructures/#werkzeug.datastructures.Headers.set) यह है कि आप एक अद्वितीय फ़ाइल नाम उत्पन्न कर सकते हैं और Werkzeug आपके लिए हेडर को सही तरीके से प्रारूपित करेगा। तथ्य यह है कि आप सीधे आइटम सेट कर सकते हैं 'हेडर्स' का एक साइड इफेक्ट 'dict 'subclass है, लेकिन हेडर के साथ काम करने का यह सबसे अच्छा तरीका नहीं है। – davidism