Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Flask send_file StringIO blank files

I'm using python 3.5 and flask 0.10.1 and liking it, but having a bit of trouble with send_file. I ultimately want to process a pandas dataframe (from Form data, which is unused in this example but necessary in the future) and send it to download as a csv (without a temp file). The best way to accomplish this I've seen is to us StringIO.

Here is the code I'm attempting to use:

@app.route('/test_download', methods = ['POST']) def test_download():     buffer = StringIO()     buffer.write('Just some letters.')     buffer.seek(0)     return send_file(buffer, as_attachment = True,\     attachment_filename = 'a_file.txt', mimetype = 'text/csv') 

A file downloads with the proper name, however the file is completely blank.

Any ideas? Issues with encoding? Has this been answered elsewhere? Thanks!

like image 926
Daniel Hitchcock Avatar asked Feb 29 '16 21:02

Daniel Hitchcock


1 Answers

The issue here is that in Python 3 you need to use StringIO with csv.write and send_file requires BytesIO, so you have to do both.

@app.route('/test_download') def test_download():     row = ['hello', 'world']     proxy = io.StringIO()          writer = csv.writer(proxy)     writer.writerow(row)          # Creating the byteIO object from the StringIO Object     mem = io.BytesIO()     mem.write(proxy.getvalue().encode())     # seeking was necessary. Python 3.5.2, Flask 0.12.2     mem.seek(0)     proxy.close()      return send_file(         mem,         as_attachment=True,         attachment_filename='test.csv',         mimetype='text/csv'     ) 
like image 139
Radu Avatar answered Sep 22 '22 02:09

Radu