これまでの記事
- 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を使って、「ひとこと掲示板」を作る


コメント