はじめに
お久しぶりです。Tomita Kentaroです。今回は、APIを触る機会が多いので、勉強としてPythonで簡単にAPIを作成してみました。
APIとは何か?
「API」とは「アプリケーション・プログラミング・インターフェース(Application Programing Interface)」の頭文字をとったもので、「インターフェース」という言葉が意味するように「境界線」「接点」を用いてアプリケーションをつなぐ機能を提供します。使用すれば、異なるソフトウェアやプログラムを連携させられるようになります。
引用元:APIとは? API連携の仕組みや事例をわかりやすく紹介 | NTTコミュニケーションズ 法人のお客さま
環境構築
今回は、MacでFlaskを使うため、以下の記事を参考に環境構築を行なっていきます。
参考資料:MacOSにFlaskのローカル開発環境を作る #Python - Qiita
まず、「API」フォルダを作成します。
$ mkdir API
$ cd API
続いて、「API」ディレクトリ内に仮想環境「venv」を作成します。
$ python3 -m venv venv
$ source venv/bin/activate
※仮想環境はdeactivate
で無効化できます。
$ deactivate
仮想環境を有効化した状態でFlask
をインストールします。
$ pip install flask
Collecting flask
Downloading flask-3.0.3-py3-none-any.whl (101 kB)
|████████████████████████████████| 101 kB 4.4 MB/s
Collecting blinker>=1.6.2
Downloading blinker-1.8.2-py3-none-any.whl (9.5 kB)
Collecting itsdangerous>=2.1.2
Downloading itsdangerous-2.2.0-py3-none-any.whl (16 kB)
Collecting Jinja2>=3.1.2
Downloading jinja2-3.1.4-py3-none-any.whl (133 kB)
|████████████████████████████████| 133 kB 20.4 MB/s
Collecting Werkzeug>=3.0.0
Downloading werkzeug-3.0.3-py3-none-any.whl (227 kB)
|████████████████████████████████| 227 kB 26.7 MB/s
Collecting importlib-metadata>=3.6.0
Downloading importlib_metadata-8.2.0-py3-none-any.whl (25 kB)
Collecting click>=8.1.3
Downloading click-8.1.7-py3-none-any.whl (97 kB)
|████████████████████████████████| 97 kB 6.0 MB/s
Collecting zipp>=0.5
Downloading zipp-3.19.2-py3-none-any.whl (9.0 kB)
Collecting MarkupSafe>=2.0
Downloading MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl (18 kB)
Installing collected packages: zipp, MarkupSafe, Werkzeug, Jinja2, itsdangerous, importlib-metadata, click, blinker, flask
Successfully installed Jinja2-3.1.4 MarkupSafe-2.1.5 Werkzeug-3.0.3 blinker-1.8.2 click-8.1.7 flask-3.0.3 importlib-metadata-8.2.0 itsdangerous-2.2.0 zipp-3.19.2
最後に環境変数を設定します。今回のサンプルコードのファイル名はapi.py
としています。
$ export FLASK_APP=api.py
$ export FLASK_ENV=development
サンプルコード
api.py
という名前のファイルを作成し、中身を以下の様にします。
from flask import Flask, request, jsonify # type: ignore
app = Flask(__name__)
# サンプルデータ
data = [
{"id": 1, "name": "Alice", "age": 30},
{"id": 2, "name": "Bob", "age": 24},
{"id": 3, "name": "Charlie", "age": 29}
]
# すべてのデータを取得するエンドポイント
@app.route('/data', methods=['GET'])
def get_data():
return jsonify(data)
# 特定のIDのデータを取得するエンドポイント
@app.route('/data/<int:data_id>', methods=['GET'])
def get_data_by_id(data_id):
item = next((item for item in data if item["id"] == data_id), None)
if item is not None:
return jsonify(item)
else:
return jsonify({"error": "Data not found"}), 404
# 新しいデータを追加するエンドポイント
@app.route('/data', methods=['POST'])
def add_data():
new_data = request.get_json()
data.append(new_data)
return jsonify(new_data), 201
# データを更新するエンドポイント
@app.route('/data/<int:data_id>', methods=['PUT'])
def update_data(data_id):
item = next((item for item in data if item["id"] == data_id), None)
if item is not None:
updated_data = request.get_json()
item.update(updated_data)
return jsonify(item)
else:
return jsonify({"error": "Data not found"}), 404
# データを削除するエンドポイント
@app.route('/data/<int:data_id>', methods=['DELETE'])
def delete_data(data_id):
global data
data = [item for item in data if item["id"] != data_id]
return '', 204
if __name__ == '__main__':
app.run(debug=True)
実行結果
実行するときは以下のコマンドを入力します。
$ flask run
今回は、Postmanを使って簡単に実行結果を紹介します。
出力されるログ
ログは以下の様に表示されます。
$ flask run
* Serving Flask app 'api.py'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
127.0.0.1 - - [25/Jul/2024 17:10:38] "GET /data HTTP/1.1" 200 -
127.0.0.1 - - [25/Jul/2024 17:13:02] "GET /data/1 HTTP/1.1" 200 -
127.0.0.1 - - [25/Jul/2024 17:14:15] "GET /data HTTP/1.1" 200 -
127.0.0.1 - - [25/Jul/2024 17:19:24] "POST /data HTTP/1.1" 201 -
127.0.0.1 - - [25/Jul/2024 17:19:45] "GET /data HTTP/1.1" 200 -
127.0.0.1 - - [25/Jul/2024 17:20:59] "PUT /data/4 HTTP/1.1" 200 -
127.0.0.1 - - [25/Jul/2024 17:21:27] "GET /data/4 HTTP/1.1" 200 -
127.0.0.1 - - [25/Jul/2024 17:21:31] "GET /data HTTP/1.1" 200 -
127.0.0.1 - - [25/Jul/2024 17:22:04] "DELETE /data/4 HTTP/1.1" 204 -
127.0.0.1 - - [25/Jul/2024 17:22:27] "GET /data HTTP/1.1" 200 -
最後に
今回は、初めてPythonでAPIを作ってみました。以前に比べて少しは知識が深まったのではないかと思います。もし、何か間違いやアドバイスがあれば、お気軽にコメントしてください!よろしくお願いいたします。