このチュートリアルでは、FlaskアプリケーションをHerokuにデプロイする方法を学びます。アプリは “Hello World” アプリのようなシンプルなものから、ソーシャルメディアモニタリングプラットフォームまで様々です!
今日、より多くの人にリーチするためのWebアプリを持たないビジネスはありませんし、オンラインポータルを介してサービスを提供することもできます。
今日は、Herokuにアプリをデプロイするためのケーススタディとして、Flaskを使ってAPIを作る方法を学びます。
FlaskでREST APIを構築する
プロジェクトディレクトリで、まず virtualenv を作成します。
$ python -m venv venv/
そして、source
コマンドで起動しましょう。
$ source venv/bin/activate
次に、pip
を使って、アプリをビルドするための flask
と、サーバーとして gunicorn
というライブラリーをインストールしましょう。
$ pip install flask
$ pip install gunicorn
私たちのアプリケーションは、名前を受け取ってウェルカムメッセージを返すシンプルなAPIになる予定です。
# app.py
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/getmsg/', methods=['GET'])
def respond():
# Retrieve the name from url parameter
name = request.args.get("name", None)
# For debugging
print(f"got name {name}")
response = {}
# Check if user sent a name at all
if not name:
response["ERROR"] = "no name found, please send a name."
# Check if the user entered a number not a name
elif str(name).isdigit():
response["ERROR"] = "name can't be numeric."
# Now the user entered a valid name
else:
response["MESSAGE"] = f"Welcome {name} to our awesome platform!!"
# Return the response in json format
return jsonify(response)
@app.route('/post/', methods=['POST'])
def post_something():
param = request.form.get('name')
print(param)
# You can add the test cases you made in the previous function, but in our case here you are just testing the POST functionality
if param:
return jsonify({
"Message": f"Welcome {name} to our awesome platform!!",
# Add this option to distinct the POST request
"METHOD" : "POST"
})
else:
return jsonify({
"ERROR": "no name found, please send a name."
})
# A welcome message to test our server
@app.route('/')
def index():
return "<h1Welcome to our server !!</h1"
if __name__ == '__main__':
# Threaded option to enable multiple instances for multiple user access support
app.run(threaded=True, port=5000)
ローカルでアプリケーションをテストするために、http://127.0.0.1:5000/ のエンドポイントをヒットしてみましょう。何も問題がなければ、ウェルカムメッセージが表示されるはずです。
http://localhost:5000/getmsg/?name=Mark` のように、パラメータとして名前を送ることもできます。
{"MESSAGE":"Welcome Mark to our awesome platform!!"}
アプリケーションの準備ができたら、Herokuにデプロイしてみましょう。
Heroku
Heroku は最初の PaaS (cloud platform as a service) の一つで、Ruby, Java, Node.js, Scala, Clojure, Python, PHP, Go という複数の言語をサポートしています。
まず最初に、アプリケーションが使用するライブラリを定義する必要があります。そうすれば、Herokuは、アプリを開発するときにローカルにインストールするのと同じように、どのライブラリを提供すればよいかを知ることができます。
これを実現するには、すべてのモジュールを含む requirements.txt
ファイルを作成する必要があります。
$ pip freeze > requirements.txt
このようにして、使用するライブラリとそのバージョンを含む requirements.txt
ファイルを完成させます。
Click==7.0
Flask==1.1.1
gunicorn==19.9.0
itsdangerous==1.1.0
Jinja2==2.10.1
MarkupSafe==1.1.1
Werkzeug==0.15.6
注意:よくある間違いのひとつに、requirements のスペルミスがあります。何時間もコードをデバッグして、サーバーがモジュールをダウンロードしなかったためにアプリが動作しないことに気がつくと、本当につらいものです。Heroku が使用しているモジュールを知る唯一の方法は、requirements.txt
ファイルにモジュールを追加することです。
Herokuがアプリケーションを正常に動作させるためには、事前に実行すべきプロセス/コマンドを定義しておく必要があります。これらのコマンドは Procfile
に記述されています。
web: gunicorn app:app
webコマンドは、Heroku に
gunicornを使ってアプリケーション用の Web サーバを起動するように指示します。アプリケーションの名前は
app.pyなので、
appの名前も
app` にしました。
Herokuアカウント
さて、Herokuのアカウントを作成しましょう。
ダッシュボードで、New – Create new appを選択します。
アプリケーションの名前を決め、ホストする地域を選びます。
Heroku上にアプリケーションが作成されたら、それをオンラインにデプロイする準備ができました。
Git
コードをアップロードするために、Gitを使用します。まず、Gitのリポジトリを作成します。
$ git init .
そして、ファイルを追加して commit
してください。
$ git add app.py Procfile requirements.txt
$ git commit -m "first commit"
Herokuにアプリをデプロイする
最後にアプリケーションをデプロイするために、Heroku関連のコマンドを実行するHeroku CLIをインストールする必要があります。コマンドを実行して、アカウントにログインしてみましょう。
$ heroku login -i
または、ブラウザーを使ってログインすることもできます。
$ heroku login
この時点で、ログインした状態で、リポジトリをリモートのリポジトリに追加してください。
$ heroku git:remote -a {your-project-name}
Your-project-name}` は、先ほどのステップで選択したプロジェクトの実際の名前に置き換えてください。
これで、プロジェクトをHerokuにプッシュしてアップロードしましょう。
$ git push heroku master
ターミナルに長い進捗ログが表示され、次のように終了します。
...
remote: -----> Discovering process types
remote: Procfile declares types -> web
remote:
remote: -----> Compressing...
remote: Done: 45.1M
remote: -----> Launching...
remote: Released v4
remote: https://{your-project-name}.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/{your-project-name}.git
ae85864..4e63b46 master -> master
おめでとうございます、あなたは最初のウェブアプリをHerokuにアップロードすることに成功しました。さて、いよいよAPIのテストと検証です。
API のテスト
コンソールに表示されたログには、アプリケーションのリンクとして https://{your-project-name}.herokuapp.com/
が表示されています。このリンクは、[設定] タブの [ドメインと証明書] セクションにも表示されています。
このリンクをクリックすると、アプリケーションがオンラインになり、公開されます。
エラーが発生した場合、ログにアクセスし、そこからトラブルシューティングを行うことができます。
URLを入力し、/getmsg/
ルートのパスを追加すれば、ブラウザでアプリを手動でテストすることができます。しかし、アプリケーションがだんだん複雑になってくると、Postmanのようなツールを使うことをお勧めします。
それでは、アプリケーションへの GET
リクエストに name
パラメータを付けてテストしてみましょう。
では、例えば /newurl
のように、どの関数にもバインドされていない URL を GET リクエストでテストしてみましょう。
予想通り、Flaskアプリは404レスポンスを返しました。
Note: 出力のビューは、Pretty、Raw、Previewから変更することができます。
それでは、 POST
リクエストをテストしてみましょう。
また、name
パラメータを完全に省略するとどうなるかを見てみましょう。
{"ERROR":"no name found, please send a name."}
アプリをテストして、すべてが正常に動作していることを確認しました。サーバーの履歴やどのようなリクエストが行われたかを確認するには、Heroku経由でサイトのログを確認することができます。
ここでは、ページ /post/
に対して行われた POST
リクエストを見ることができます。
また、アプリケーションの構築の履歴も見ることができます。さらに、構築中に何か問題が発生した場合は、ログページで確認することができます。
結論
この記事では、Flaskマイクロフレームワークを使用してHeroku上で最初の簡単なAPIを構築する例を示しました。開発プロセスは、アプリケーションの構築を続けても変わりません。
Herokuは無料プランと学生プランを提供しています。無料プランは制限がありますが、例えばスタートアップのアプリ、POC、またはシンプルなプロジェクトにはかなり有効です。しかし、あなたのアプリケーションを拡張したい場合は、ここからサイト上で利用可能なプランのいずれかを検討することをお勧めします。
Herokuの詳細については、Herokuのマニュアルを参照してください。