Herokuって無料らしいじゃん?
じゃあWebアプリ作るしかないべ。
想定していたのはオンラインゲームでP2P通信をするためのIPアドレスを交換するためのWebアプリです。
おおよその実装は以下で公開しています。真似しない方が良い部分もあるので注意してください。
PostgreSQLとSQLAlchemy
Flask + Herokuで検索するとPostgreSQLとSQLAlchemyの話ばかり出てくると思います。
PostgreSQLは割とメジャー(就活の利用経験の欄に出てくるレベル)なので使ってみていいと思います。
SQLAlchemyはデータベースの違いを吸収してくれるライブラリです。多分MySQL使ってもSQLite使ってもPostegre使っても全部似たような書き方になるではないでしょうか。Postgreしか使ったことないから知らんけど。
PostgreSQLはherokuのAdd-onから追加しましょう。Resources→PostgreSQL→Setting→Database CredentialsからURIを取得します。そのURIをSQLAlchemyのデータベース用のURLとして使用します。
SQLAlchemyの書き方自体はシンプルです。
簡単に書くと
DB_URI = "*"
engine = create_engine(DB_URI)
@app.route("/some_func/", methods=['POST'])
def some_func():
SessionClass = sessionmaker(engine) # おまじない
session = SessionClass() # おまじない
# 何らかの変更
session.commit() # 変更の反映
session.close()
詳しいクエリの書き方は除きますがおおよそこんな感じです。
エンジンはアプリにつき一つ、セッションはリクエストごと一つって感じ、らしい
webアプリはまずはローカル環境で実行してPythonのHTTPクライアントを作って一つ一つテストしてみるのが良いと思います。
Heroku CLI
heroku CLIはデプロイするためのツールです。gitも同時に必要になります。そこらへんに転がってるものをインストールしましょう。
herokuへのデプロイは簡単で、herokuのDeployの欄に実行するコマンドが全て書いてあります。
ただし、そのままデプロイすると何もしないWebアプリの完成です。
heroku open
してもなんか「Congrats!」的なメッセージが出るだけです。
それは、
「どの言語のWebアプリか」の情報Buildpackと、
「どのモジュールを入れるか」の情報requirements.txtと、
「サーバーが何をすれば良いか」の情報Procfileが不足しているからです。。
Buildpack
Buildpackはheroku管理ページのSettingにあるので使ってる言語のBuildpackを入れましょう。わーい!
もちろんFlaskを使っている場合はPythonです。
次にプロジェクトのディレクトリにrequiremenets.txt
を作成します(必須)
Buildpackはこのrequirements.txt
をつかってモジュールのインストールをしてくれます。
中身はこんな感じ!ウキキ!
使っているモジュールのリストなので人によって増減します。
Flask==1.1.1
gunicorn==20.0.4
SQLAlchemy==1.3.5
psycopg2 == 2.9.3
ちなみにherokuはgunicornを使うのでgunicornを入れる、らしい。
あとはこんな感じのProcfile
(必須)を作ってかんせ~~~い。ワア!
web: gunicorn --bind 0.0.0.0:$PORT app:app
あとはDeployに書いてあるとおりにコマンドを実行していけば無事公開されると思います。
動かない時は...
heroku logs
を実行するとだいたい書いてあります。requirements.txtのモジュール漏れが大半じゃないでしょうか。
code=H10 desc="App crashed"
やerror: failed to push some refs to
もだいたいheroku logs
かheroku管理画面のOverview右上のview build log
を参照することで解決できます。
(前者はモジュール漏れ、後者は必要なファイルが足りてない)
以上!
いやぁコマンド一つでアプリを無料デプロイできるのってすごい良いですよね。
エラーが出た時にとりあえず検索 → 試すを繰り返していたため紹介しきれなかった設定があるかもしれないですがご容赦いただきたい。多分必須知識は書いたかなと思います。