奇人凡人の雑記帳

趣味とか投資とか、twitterに書きにくいことをこちらに書きます。毎週金曜更新目標(現在多忙のため月1の投資成績がメインです)

pythonanywhereにデプロイしたwebページでファイルダウンロードの実装

追記

2022/4/29 

  send_from_directoryの引数filenameがFlask 2.0.0以降はpathに変更になったことを追記

--------------------------------

h05torです。

 

前回の記事Pythonでzipファイルへの格納について備忘録を書きましたが、今回はその続編として生成したzipファイルをwebページからダウンロードする部分についての備忘録を記事として残します。

流れとしましては、

pythonanywhereにデプロイしているwebページで処理した結果をバックグラウンドでcsv化+zipファイルに格納(前回記事はここまで)

                  ↓

webページ搭載したダウンロードボタンを押すとzipファイルがダウンロードされる

といった感じです。

 

前回記事の続きということで、zipファイルの生成は済んでいる状態とします。

そのため今回はmodule1.pyのプログラムは使用せず単純に既に用意されているzipファイルをダウンロードするだけのwebページを作成するだけです。

zipファイルはsave_space階層に保存されており(赤囲み)、黄色で囲っている部分がzipファイルの中身となっています。

なお、今回はwebページ側の要素が多いため前回記事のファイル配置の図に以下が追加されています。

Flaskの仕様によりmysite階層の中にtemplates階層を配置し、立ち上げるwebページとしてindex.htmlが含まれています。

f:id:h05tor:20220214232418p:plain

  

それでは、ファイルダウンロードの手順の説明に入ります。

まずはFlaskでwebページの立ち上げのためのflask_app.pyのコードです。

pythonanywhereでFlaskを使用する際はデフォルトでflask_app.pyという名前になります。

#flask_app.py
from flask import Flask,render_template,send_from_directory

app = Flask(__name__) 

"""
・ここでwebページを立ち上げる
"""

@app.route("/",methods=['GET']) def index(): return render_template("index.html") """ ・ファイルダウンロードの部分
directoryでダウンロードしたいファイルの階層を相対パスで指定
filenameでダウンロードしたいファイル名
as_attachmentはTrueにしておけばOK
attachment_filenameはダウンロードしたいファイルのnameを変更したい場合に指定
""" @app.route("/downloadzip",methods=['GET']) def downloadzip(): try: return send_from_directory( directory = "../simulatefile", filename="zipfile.zip",#flask2.0.0以降はfilename→pathに引数名が変更 as_attachment=True, attachment_filename="zipfile.zip", ) except: return "<html><p>エラー</p></html>" """ pythonanywhereにデプロイする際は以下は省略する """ if __name__ == "__main__": app.debug = True app.run(host = "localhost")

 

またwebページとなる、htmlファイル(index.html)は以下のようになります。

<!--index.html -->
<!docutype html>
<html lang ="ja">
<head>
    <title>サンプルアプリ</title>
    <meta charset="utf-8"/>
    <link rel="stylesheet"
        href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
</head>

<body>
    <div class="container center-block col-md-10">
        <h1 class="text-center">sample</h1>
        <div class="row">
            <button class="btn btn-info btn-sm" onclick="location.href='/downloadzip'" id="download">ダウンロード</button>
        </div>
    </div>
</body>

</html>

表示されるwebページ自体は「ダウンロード」ボタンがあるだけのめちゃくちゃシンプルなページです。

ボタンの作り方は色々あると思いますが私の場合は今回bootstrapで作っております。(htmlファイルの最初の方で外部からcss読み込んでいるのがbootstrapです)

ボタンの機能ですが、onclick要素を設定しlocation.hrefでURLを/downloadzipに設定することでボタンを押した際にflask_app.pydef download_zip(デコレーターでURLが/downloadに設定されている。methodsはGETとすること)のプログラムが取得され、zipファイルがダウンロードされるようになっております。

 

 

 

今後も業務用?自作webアプリで搭載した要素などで残しておきたいものがあれば備忘録として記事にしていきます。