2015-01-18 7 views
5

मैं उपयोगकर्ता को उनके कार्यों द्वारा परिभाषित डेटा के साथ एक CSV फ़ाइल डाउनलोड करने की अनुमति देने का प्रयास कर रहा हूं। फ़ाइल मौजूद नहीं है, यह गतिशील रूप से बनाई गई है। मैं फ्लास्क में यह कैसे कर सकता हूं?फ्लास्क व्यू से एक CSV फ़ाइल बनाएं और डाउनलोड करें

उत्तर

9

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() 
+0

'प्रतिक्रिया.हेडर ['सामग्री-विस्थापन'] = 'लगाव; फ़ाइल नाम = "download.csv" '' भी काम करता है। –

+2

@ डेव डब्ल्यू। 'हेडर.एड' और ['हेडर.सेट'] के बारे में अच्छी बात है (http://werkzeug.pocoo.org/docs/0.11/datastructures/#werkzeug.datastructures.Headers.set) यह है कि आप एक अद्वितीय फ़ाइल नाम उत्पन्न कर सकते हैं और Werkzeug आपके लिए हेडर को सही तरीके से प्रारूपित करेगा। तथ्य यह है कि आप सीधे आइटम सेट कर सकते हैं 'हेडर्स' का एक साइड इफेक्ट 'dict 'subclass है, लेकिन हेडर के साथ काम करने का यह सबसे अच्छा तरीका नहीं है। – davidism

संबंधित मुद्दे