ウェブサイト検索

UbuntuでFlaskを使ってREST APIを作成する方法


紹介

このチュートリアルでは、軽量なPythonウェブフレームワークであるFlaskを使ってシンプルなREST APIを作成する方法を学びます。Flaskアプリケーションの設定、ルートの定義、リクエストの処理、JSONレスポンスの返送の基本をカバーします。このチュートリアルの終わりまでに、他のアプリケーションと拡張・統合できる動作するAPIを持つことができるようになります。

前提条件

  • Ubuntuを実行しているサーバーと、sudo特権を持つ非ルートユーザー、そしてアクティブなファイアウォールが必要です。この設定についてのガイダンスを得るには、このリストからご自身のディストリビューションを選択し、初期サーバーセットアップガイドに従ってください。サポートされているバージョンのUbuntuを使用することを確認してください。

  • Linuxコマンドラインに対する親しみ。コマンドラインの入門やリフレッシュには、このLinuxコマンドライン入門ガイドを訪れてください。

  • Pythonプログラミングの基本的な理解。

  • UbuntuシステムにPython 3.7以上がインストールされていること。UbuntuでPythonスクリプトを実行する方法を学ぶには、「UbuntuでPythonスクリプトを実行する方法」についてのチュートリアルを参照してください。

ステップ 1 — Flask 環境の設定

Ubuntu 24.04はデフォルトでPython 3を搭載しています。ターミナルを開いて、Python 3のインストールを再確認するために次のコマンドを実行してください:

root@ubuntu:~# python3 --version
Python 3.12.3

もしあなたのマシンにPython 3がすでにインストールされている場合、上記のコマンドは現在のPython 3のインストールバージョンを返します。もしインストールされていない場合は、以下のコマンドを実行してPython 3のインストールを取得できます。

root@ubuntu:~# sudo apt install python3

次に、システムにpipパッケージインストーラーをインストールする必要があります。

root@ubuntu:~# sudo apt install python3-pip

一度 pip がインストールされたら、Flask をインストールしましょう。

Flaskはpipを使用してインストールします。システム内の他のパッケージとの競合を避けるために、仮想環境での実行をお勧めします。

root@ubuntu:~# python3 -m venv myprojectenv
root@ubuntu:~# source myprojectenv/bin/activate
root@ubuntu:~# pip install Flask

ステップ2 - Flaskアプリケーションを作成する

次のステップは、FlaskアプリケーションのためにPythonコードを書くことです。新しいスクリプトを作成するには、好みのディレクトリに移動してください:

root@ubuntu:~# cd ~/path-to-your-script-directory

ディレクトリ内にいるときに、新しいPythonファイルapp.pyを作成し、Flaskをインポートします。それから、Flaskアプリケーションを初期化し、基本的なルートを作成します。

root@ubuntu:~# nano app.py

これにより、空のテキストエディタが開きます。ここに自分のロジックを書いたり、次のコードをコピーしたりしてください:

from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/')
def hello_world():
    return jsonify(message="Hello, World!")

In-memory data store
items = [{"id": 1, "name": "This is item 1"}, {"id": 2, "name": "This is item 2"}]

ステップ3 — RESTfulルートの作成

このセクションでは、Flaskアプリケーション内で、ユーザーがAPIで実行できるさまざまなアクションに対応するルートを定義します。各ルートは特定のHTTPメソッドを処理します。

GET、POST、PUT、およびDELETE。これらのメソッドは、永続ストレージの4つの基本操作に対応しており、一般にCRUD(作成、読み取り、更新、削除)と呼ばれます。

app.py Python スクリプトに次のルートを追加してください。

from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/')
def hello_world():
    return jsonify(message="Hello, World!")

In-memory data store
items = [{"id": 1, "name": "This is item 1"}, {"id": 2, "name": "This is item 2"}]

GET request: Retrieve all items
@app.route('/api/items', methods=['GET'])
def get_items():
    return jsonify(items)

GET request: Retrieve a specific item by ID
@app.route('/api/items/<int:item_id>', methods=['GET'])
def get_item(item_id):
    item = next((item for item in items if item["id"] == item_id), None)
    if item is None:
        return jsonify({"error": "Item not found"}), 404
    return jsonify(item)

POST request: Create a new item
@app.route('/api/items', methods=['POST'])
def create_item():
    new_item = {"id": len(items) + 1, "name": request.json.get('name')}
    items.append(new_item)
    return jsonify(new_item), 201

PUT request: Update an existing item
@app.route('/api/items/<int:item_id>', methods=['PUT'])
def update_item(item_id):
    item = next((item for item in items if item["id"] == item_id), None)
    if item is None:
        return jsonify({"error": "Item not found"}), 404
    item['name'] = request.json.get('name', item['name'])
    return jsonify(item)

DELETE request: Delete an item
@app.route('/api/items/<int:item_id>', methods=['DELETE'])
def delete_item(item_id):
    global items
    items = [item for item in items if item["id"] != item_id]
    return '', 204

if __name__ == "__main__":
    app.run(debug=True)

各機能が何をするのかについてもっと知りましょう:

  • Flaskのインポート: コードはFlaskから必要なコンポーネントをインポートします:Flask、jsonify、およびrequest。

  • インメモリデータストア: items は API のための一時データストアとして機能する単純な辞書のリストです。各アイテムには id と name があります。

  • GET /api/items: /api/itemsにGETリクエストが送信されると、サーバーはアイテムデータストア内のすべてのアイテムのリストを返します。これは、コレクション内のすべてのリソースを取得するのに役立ちます。

  • POST /api/items: /api/itemsへのPOSTリクエストは、クライアントが新しいアイテムを作成できるようにします。サーバーはリクエストボディに新しいアイテムの詳細を含むJSONオブジェクトを期待します。アイテムを作成した後、サーバーは新しく作成されたアイテムと201 Createdステータスコードを返します。

  • PUT /api/items/<int:item_id>: /api/items/<item_id>へのPUTリクエストは、指定されたitem_idを持つ既存のアイテムを更新するために使用されます。クライアントはリクエストボディに更新されたデータを送信し、サーバーは既存のアイテムを修正します。アイテムが見つからない場合、サーバーは404 Not Foundエラーを返します。

  • 削除 /api/items/<int:item_id>: /api/items/<item_id>へのDELETEリクエストは、指定されたitem_idを持つアイテムをデータストアから削除します。アイテムが正常に削除されると、サーバーは204 No Contentステータスコードで応答し、削除が成功したことを示し、返すべきコンテンツがないことを示します。

  • アプリケーションの実行: if __name__ == "__main__": ブロックは、スクリプトが直接実行されるときにFlaskアプリケーションが実行されることを保証します。

ステップ4 — APIの実行とテスト

次のコマンドを使用してFlaskサーバーを起動します:

root@ubuntu:~# python3 app.py

以下の出力でFlaskサーバーが実行されていることに気付くべきです:

* Serving Flask app 'app'
 * Debug mode: on
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
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 837-877-972

上記の出力から、サーバーが http://127.0.0.1 で実行されており、ポート 5000 で待機していることが分かります。

これで、curl、Postman、または他のHTTPクライアントを使用してエンドポイントをテストすることができます。このチュートリアルでは、curlを使用してエンドポイントをテストし、HTTPリクエストを送信します。

別のUbuntuコンソールを開き、以下のcurlコマンドを1つずつ実行してください:

  • 取得: curl http://127.0.0.1:5000/api/items
  • POST: curl -X POST -H "Content-Type: application/json" -d '{"name": "これはアイテム3です"}' http://127.0.0.1:5000/api/items
  • 更新: curl -X PUT -H "Content-Type: application/json" -d '{"name": "これは更新されたアイテム1です"}' http://127.0.0.1:5000/api/items/1
  • 削除: curl -X DELETE http://127.0.0.1:5000/api/items/1

これらのコマンドがどのように機能するか見てみましょう:

root@ubuntu:~# curl http://127.0.0.1:5000/api/items
[
  {
    "id": 1,
    "name": "This is item 1"
  },
  {
    "id": 2,
    "name": "This is item 2"
  }
]

サーバーがアイテムデータストア内のすべてのアイテムのリストを返すことに気付くでしょう。

POSTメソッドを使用して、新しいアイテムをデータストアに追加しましょう。

root@ubuntu:~# curl -X POST -H "Content-Type: application/json" -d '{"name": "This is item 3"}' http://127.0.0.1:5000/api/items
{
  "id": 3,
  "name": "This is item 3"
}

注: Flaskサーバーが実行されている別のコンソールでは、すべてのHTTPリクエストが実行され、その応答コードも表示されるのを確認できます。

* Running on http://127.0.0.1:5000
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 837-877-972
127.0.0.1 - - [23/Aug/2024 06:57:27] "GET /api/items HTTP/1.1" 200 -
127.0.0.1 - - [23/Aug/2024 06:59:56] "POST /api/items HTTP/1.1" 201 -

これはサーバーの監視、デバッグ、トラブルシューティングを行うための素晴らしい方法です。

次に、PUT リクエストを実行しましょう。/api/items/<item_id> への PUT リクエストは、指定された item_id を持つ既存のアイテムを更新します。

root@ubuntu:~# curl -X PUT -H "Content-Type: application/json" -d '{"name": "This is updated item 1"}' http://127.0.0.1:5000/api/items/1
{
  "id": 1,
  "name": "This is updated item 1"
}

では、更新されたアイテム1を確認するためにGETリクエストを実行しましょう。

root@ubuntu:~# curl http://127.0.0.1:5000/api/items/1
{
  "id": 1,
  "name": "This is updated item 1"
}

ついに、データストアからアイテムを削除するためにDELETEリクエストを実行しましょう。

root@ubuntu:~# curl -X DELETE http://127.0.0.1:5000/api/items/1

これにより、データストアからアイテム1が削除されます。

これを確認するために、GETリクエストを実行しましょう。

root@ubuntu:~# curl http://127.0.0.1:5000/api/items
[
  {
    "id": 2,
    "name": "This is item 2"
  },
  {
    "id": 3,
    "name": "This is item 3"
  }
]

アイテム1がもはや存在せず、永久に削除されたことに気づくでしょう。

結論

このチュートリアルでは、Flaskを使用して基本的なREST APIアプリを作成しました。これで、このAPIを追加のルートで拡張したり、データベースと統合したり、DigitalOceanのようなクラウドプラットフォームにデプロイしたりできます。Flaskは、APIを迅速かつ効率的に構築するための強力なツールであり、この基本を覚えたことで、より複雑なアプリケーションの構築を始める準備が整いました。

関連記事: