2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MacとFlaskで簡単なAPIを作ってみた!

Posted at

はじめに

 お久しぶりです。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という名前のファイルを作成し、中身を以下の様にします。

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を使って簡単に実行結果を紹介します。

まずは、全データ出力します。
スクリーンショット 2024-07-25 17.11.07.png

続いて、指定したidのデータを出力します。
スクリーンショット 2024-07-25 17.13.20.png

続いて、新しいデータを追加します。
スクリーンショット 2024-07-25 17.19.38.png

続いて、データを更新してみます。
スクリーンショット 2024-07-25 17.21.20.png

最後にデータを削除してみます。
スクリーンショット 2024-07-25 17.22.19.png

出力されるログ

ログは以下の様に表示されます。

$ 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を作ってみました。以前に比べて少しは知識が深まったのではないかと思います。もし、何か間違いやアドバイスがあれば、お気軽にコメントしてください!よろしくお願いいたします。

2
0
0

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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?