Python(Flask)でWebAPIを作成しデプロイした際の備忘録
どうもtakeです。 はてなブログも書いたりしています。
普段は golangでバックエンドの開発を行っているのですが、1週間ほどPythonについて調べつつWebAPIをデプロイしました。
1. WebAPIをローカル環境で作成
前提条件
- Githubに関する知識がある
- Herokuのアカウントがある
今回の開発環境
- MacBook Pro 2018 (OS:Big Sur 11.2.1)
- Python 3.7.10(このバージョンは任意)
- Flask 1.1.2
注意事項:後述しますが、デプロイの際にはサポートされているバージョンに合わせる必要があります。
Flaskのinstall
pip install Flask
簡単なAPIの作成
今回僕が作ったAPIは外部のAPIを利用して必要な情報のみを返すAPIだったためDBは利用していません。
下記のようなmain.pyを作成します。
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/hello', methods=["GET"])
def hello_world():
return jsonify({'message': 'Hello, world'})
if __name__ == "__main__":
app.run(debug=True)
実行します
python main.py
http://127.0.0.1:5000/helloにアクセスすると
{
"message": "Hello, world"
}
レスポンスが得られました。
注意事項
ここに書いているAPIは簡単なものです。各々の目的に合わせてエンドポイントを追加し、処理を記述してください。
2. 作成したAPIをデプロイする
デプロイ環境
- Heroku
注意事項:サポートされているveriosnについて
Herokuでは全てのPythonのバージョンがサポートされているわけではありません。
下記のサイトからサポートされているバージョンを確認
(なぜかこのサイトに書いてあるものではうまく動作せず、僕の開発段階ではversion3.7.10で動作)
Herokuサポートバージョン
デプロイに必要なファイルの準備
-
main.py(プログラムファイル)
Pythonの実行ファイル -
runtime.txt(Pythonのバージョンを記載)
echo python-3.7.10 > runtime.txt
- requirements.txt(インストールすべきライブラリ(パッケージ)を記載)
pip freeze > requirements.txt
- Procfile(プログラムの実行方法を記載)
echo web: python main.py > Procfile
いよいよデプロイ
すでにGit管理下にあるものとして説明しています。
Herokuにlogin
heroku login
対象のリポジトリに移動する
Herokuでアプリケーションを作成
heroku create [任意のアプリケーション名]
Herokuにデプロイする(メインブランチ以外のブランチをデプロイする場合は**<ブランチ名>:main**)
git push heroku main
発生した問題
- デプロイができたがすぐにクラッシュする
どうやらFlaskは外部に公開するためには開放するport周りで指定が必要なようだった
最後の1行を下記のように変更したらいけた
app.run(debug=False, host='0.0.0.0', port=8080)
- レスポンスの日本語が文字化けする
下記のように1行文字コードについての指定を加えることで解決
app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False
- ログに関して
Procfileに以下を追加
web: gunicorn main:app --log-file -
参考にした記事
- Pythonのversion変更の際に参考にした記事
https://qiita.com/TheHiro/items/88d885ef6a4d25ec3020#%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95
https://teratail.com/questions/323061
# もしかしたらインストールの際に役に立つかも
pyenv install --patch 3.7.2 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)