1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

FlaskでWebAPIを作成しデプロイした

Last updated at Posted at 2021-03-28

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を作成します。

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行を下記のように変更したらいけた
main.py
    app.run(debug=False, host='0.0.0.0', port=8080)
  • レスポンスの日本語が文字化けする
    下記のように1行文字コードについての指定を加えることで解決
main.py
app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False

  • ログに関して
    Procfileに以下を追加
web: gunicorn main:app --log-file -

参考にした記事

# もしかしたらインストールの際に役に立つかも
pyenv install --patch 3.7.2 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)
1
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?