2015-01-18 17 views

cevap

9

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

'response.headers ['Content-Disposition'] = 'attachment; filename = "download.csv" ''da çalışır. –

+2

@ 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

İlgili konular