How to stream CSV from Flask via sqlalchemy query? How to stream CSV from Flask via sqlalchemy query? flask flask

How to stream CSV from Flask via sqlalchemy query?


Here's how I resolved this question. It doesn't use the streaming featured I was curious about originally. I would still be interested in a solution using that technique.

@app.route('/download')@login_requireddef download():    "Export a CSV of all sales data"    purchases = Purchase.query.all()    csvfile = cStringIO.StringIO()    headers = [        'uuid',        'recipient_name',        'recipient_email',        'shipping_street_address_1',        'shipping_street_address_2',        'shipping_city',        'shipping_state',        'shipping_zip',        'purchaser_name',        'purchaser_email',        'personal_message',        'sold_at',        'coupon_used'    ]    rows = []    for purchase in Purchase.query.all():        rows.append(            {                'uuid': purchase.uuid,                'recipient_name': purchase.recipient_name,                'recipient_email': purchase.recipient_email,                'shipping_street_address_1': purchase.shipping_street_address_1,                'shipping_street_address_2': purchase.shipping_street_address_2,                'shipping_city': purchase.shipping_city,                'shipping_state': purchase.shipping_state,                'shipping_zip': purchase.shipping_zip,                'purchaser_name': purchase.purchaser_name,                'purchaser_email': purchase.purchaser_email,                'personal_message': purchase.personal_message,                'sold_at': purchase.sold_at.strftime('%c'),                'coupon_used': purchase.coupon_used            }        )    writer = csv.DictWriter(csvfile, headers)    writer.writeheader()    for row in rows:        writer.writerow(            dict(                (k, v.encode('utf-8') if type(v) is unicode else v) for k, v in row.iteritems()            )        )    csvfile.seek(0)    return send_file(csvfile, attachment_filename='sales_export.csv', as_attachment=True)


Explain Ronny's answer: You should add stream_with_context() function to Response() for keeping the Context.