エクセルsheetを複数作成してくれるWebアプリを作ったよ(Python+Flask+GAE+Excel)
出来たものがこちら
僕のような初学者が下記のようなプロセスで作成したという記録を書いていきたいと思います。
きっかけ
仕事で各ソースファイルごとに調査をする必要があり、エビデンスとしてエクセルを使用。
各ファイル名のシートを作成するため、そのようなファイルを作成してくれるものが欲しかった。
Flask,GCPにも興味はあったので触ってみたかった。
まず何をしたか
まずはFlaskで「Hello World」を表示ができるようにしました。
pythonファイルとhtmlファイルのみの構成でまずはSTEP1としました。
次にボタンを押したらとりあえずExcelファイルをダウンロードするように実装します。
こちらは「Flask Excel」と検索して出てきたサイトを参考にしました。
https://lightgauge.net/language/python/flask-excel-download
これが出来たら
textareaの改行をどのように処理されるのかの確認です。
改行がpythonに来る前に消されているかもしれないのでその確認を行います。
改行を含んでStringでやってきたのでsplitlines()で改行区切りのListに変えて、
それをfor文で回してシートの作成を行う。
この時点でダサいですが完成です。
あとはBootstrapに関して調べて連携、classごとにまとめてあるサイトからそれっぽいのを持ってきます。
これで完成です。
次にはGCPについて調べます。
アカウント作成など諸々を調べてデプロイして完成です。
requirements.txtとapp.yamlは作ります。
途中で躓いたエラーなど
ERROR: (gcloud.app.deploy) INVALID_ARGUMENT: The first service (module) you upload to a new application must be the 'default' service (module). Please upload a version of the 'default' service (module) before uploading a version for the 'production-service' service (module). See the documentation for more information. Python: (https://developers.google.com/appengine/docs/python/modules/#Python_Uploading%%20modules) Java: (https://developers.google.com/appengine/docs/java/modules/#Java_Uploading%%20modules)
こちらは
以下の記事に書いてありました。
https://qiita.com/ezaqiita/items/df24cdef6dee6d38509f
まずはdefaultとしてデプロイする必要があるそうです。
チュートリアルにあるHello wordをデプロイします。
①
Error: Server Error The server encountered an error and could not complete your request.
こちらは
entrypoint: gunicorn -b :$PORT home:app
を追加したらうまくいきました。
また「home」というのは「home.py」がmainファイルだからです。
「hello.py」なら「hello:app」にする必要があります。
②
requirements.txtの文字コードの変更と
gunicorn==20.1.0
を書くことです。
こちらは公式に書いてありました。
https://cloud.google.com/appengine/docs/flexible/python/runtime#application_startup
③
ダウンロードできない....
ローカルではできるのに...
ログを見たらこう書いてありました。
OSError: [Errno 30] Read-only file system:
こちらは
https://qiita.com/namkim/items/3edb9abe3871963bf0f7
が参考になりました。
クラウドだとあるあるのようです。
一度tmpフォルダを間にかますことでダウンロードできました。
これのせいでローカル環境では動かなくなりましたが、まぁいいでしょう。
# ワークブックをディスクに保存
wb.save(r'/tmp/'+filename)
(中略)
# ダウンロードするEXCELファイルを開く
wb = open(r'/tmp/'+filename, "rb")
(中略)
# MIMEタイプをレスポンスに設定
os.remove(r'/tmp/'+filename)
としました。
これから
フールプルーフ的な制御などなにもないので、これらについても考えたりしないといけませんねぇ...
説明文に何を書けば満足なのか、ヒントテキストはどうすれば良いのかなど自分にセンスがない部分は絶賛苦戦中です。