Flask App を Heroku にデプロイする
前回の続きです。
Heroku にデプロイしてみようと思って doc を読みながらすすめました。Gemfile
のように requirements.txt
が必要とのことです。これはコマンドラインから pip freeze > requirements.txt
で生成することができます。
Procfile
というのも必要らしいのですが、何を書いてよいのかわかりません。例題は Django なので Flask とは違いますよね?
web: flask run
でいいみたい。で、heroku local web
を実行するとアプリケーションを起動してくれる。動作も問題ないみたいです。ただ、環境変数に指定している 'FLASK_APP=hello.py' は Heroku 上では設定されていない訳で、これはどうすればいいのだろう?
どうやら .env
というファイルで設定できるみたい。もしくは直接コマンドラインから Heroku に環境変数を設定することもできるそう。その場合は
heroku config:set FLASK_APP=hello.py
のようにすればいいらしい。でももっと簡単な方法はないでしょうか?
.gitignore
には、venv, *.pyc, staticfiles, .env を記入するように書いてあったけれども、とりあえずは venv と *.pyc だけ書いておくことにしました。
hello.py
を app.py
に変更して、一番下に次の語句を入れて、
if __name__ == "__main__": port = int(os.environ.get("PORT", 5000)) app.run(host="0.0.0.0", port=port)
Procfile
の内容を
web: python app.py
にしてお茶を濁すことに。これで動くはず。
だったのですが……実際に Heroku にデプロイをしてみたら下記のエラーが出てしまいました。
SyntaxError: Non-ASCII character '\xe3' in file app.py on line 15, but no encoding declared
そこで、Procfile
の内容を
web: python3 app.py
に修正して再度デプロイしてみることに。しかし今度は
Fatal Python error: Py_Initialize: Unable to get the locale encoding ImportError: No module named 'encodings'
というエラーが……
runtime.txt
でバージョンを選べるとのことなので、内容を python-3.5.2
にしたものを用意して再度デプロイしました。その時のメッセージが下記のようになっていましたので、今度こそは大丈夫でしょう。
remote: -----> Python app detected remote: -----> Found python-2.7.12, removing remote: -----> Installing python-3.5.2 remote: $ pip install -r requirements.txt ...
うまくいきました!確かに、一番最初にデプロイした時のログを見ると
remote: -----> Python app detected remote: -----> Installing python-2.7.12 remote: $ pip install -r requirements.txt ...
のように Python 2 系がインストールされていました。ここは注意しないといけませんね。
もう 3.6 がリリース間近やいうのに、なんで 3 系がデフォルトになってないねん。