python 3.5とflask 0.10.1を使用して気に入っていますが、send_fileに少し問題があります。 pandasデータフレーム(この例では未使用ですが、将来必要になるフォームデータから)を最終的に処理し、csv(一時ファイルなし)としてダウンロードして送信します。これを実現するための最良の方法は、StringIOを使用することです。
これが私が使用しようとしているコードです:
@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')
ファイルは適切な名前でダウンロードされますが、ファイルは完全に空白です。
何か案は?エンコーディングの問題?これは他の場所で回答されていますか?ありがとう!
ここでの問題は、Python 3ではStringIO
をcsv.write
とともに使用する必要があり、send_file
にはBytesIO
が必要なので、両方を行う。
@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('utf-8'))
# 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'
)
バイトを書くべきだと思います。
from io import BytesIO
from flask import Flask, send_file
app = Flask(__name__)
@app.route('/test_download', methods=['POST'])
def test_download():
# Use BytesIO instead of StringIO here.
buffer = BytesIO()
buffer.write(b'jJust some letters.')
# Or you can encode it to bytes.
# buffer.write('Just some letters.'.encode('utf-8'))
buffer.seek(0)
return send_file(buffer, as_attachment=True,
attachment_filename='a_file.txt',
mimetype='text/csv')
if __name__ == '__main__':
app.run(debug=True)
誰かがpython 2.7 with Flaskを使用し、それをインポートしてStringIOモジュールに関するエラーを受け取った場合。この投稿は問題解決に役立ちます。
String IO moduleをインポートしている場合は、これを使用してインポート構文を変更できます:from io import StringIO代わりにfrom StringIO import StringIO =。
画像または他のリソースを使用している場合は、from io import BytesIOを使用することもできます。
ありがとうございました