sci

最果て風呂

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.pyapp.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 系がデフォルトになってないねん。