これまでの記事
- Flaskによるwebアプリ開発①~簡単なページを表示させる
- flaskでのWebアプリ開発②~テンプレートエンジン(Jinja2)で動的Webページを作る
- flaskでのWebアプリ開発③~GETとPOSTとformタグでのデータの送受信
- flaskでのWebアプリ開発④~SQLAlchemyを使ってデータベースと連動させる
- FlaskによるWebアプリ開発⑤~url_forでの動的URLの作成
Flaskでファイルダウンロード機能を実装する
実務でwebアプリを作るにあたって、よくあるのがログとか履歴とかcsvのファイルダウンロード機能の実装です。今回はこれをFlaskで実装していきたいと思います。
Python+Flaskベースでファイルのダウンロード機能を実装するためにはフロント側とのファイルのやり取りはHTMLを返すrender_template()の他に以下の3つが選択肢に上がってきます。
- send_file()
- send_from_directory()
- make_response()
よくあるファイルのダウンロードの場合だと、send_file()
send_from_directory()
かだが、基本的に send_from_directory()
で問題ないと思います。
<app.py>
from flask import Flask, send_from_directory import os app = Flask(__name__) @app.route('/') def index(): return "<html><h3>Flaskでファイルダウンロードを実装する</h3><a href='/export'>csvダウンロード</a></html>" @app.route("/export") def export_action(): # 現在のディレクトリを取得 path = os.path.abspath(__file__)[:-7] return send_from_directory( directory=path + '\export_temp', filename='test.csv', as_attachment=True, attachment_filename='test.csv', ) app.run(debug=True)
元ファイル:https://github.com/beginerSE/Flask_filedownload
ただバックエンドで機械学習とかディープラーニングを行って、その学習過程とかをMatplotlibで画像にプロットして、その画像をフロント画面に返したい、なんて場合は、ファイル形式だけでなくバイナリも渡せる make_response()
を使うって感じだと思います.
関連記事:【Python】FlaskでMatplotlibでプロットしたグラフを表示させる
終わり
サンプルコードはGitの方に挙げているので、ファイル構成やCSVの中身などはそちらをダウンロードして確認してください。
一瞬で処理が完結する数KB程度の簡単なCSVファイル出力とかであればこれで問題ありませんが、ファイルのダウンロードは時間が掛かる場合とかだとAjaxなどで非同期処理で行うとユーザービリティを損ねずに済みます。
関連記事:【Python】Bottleとajaxでデータのアップロード処理を実装する
関連記事:【Python】Flask+SQLAlchemyを使って、「ひとこと掲示板」を作る
コメント