Ubuntu上でFlaskを使用してREST APIを作成する方法

はじめに

このチュートリアルで、軽量のPythonのウェブフレームワークであるFlaskを使用して簡単なREST APIを作成する方法を学びます。Flask アプリケーションの基本的な設定方法、ルーティングの定義、リクエストの処理、およびJSONレスポンスの返信を含みます。このチュートリアルの最後までに、拡張して他のアプリケーションと統合することができる機能を持つAPIを作成することができます。

前提条件

  • Ubuntuを実行しているサーバーと、sudo権限を持つ非rootユーザー、有効化されたファイアウォールです。設定方法についての指导には、このリストからあなたのディストリビューションを選択し、最初のサーバー設定ガイドに従ってください。Ubuntuのサポートされているバージョンで作業してください。

  • Linuxのコマンドラインを熟悉していること。コマンドラインの入門やリフレッシュについてのガイドには、Linux command line primerを参照することができます。

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

  • Python 3.7またはそれ以上のバージョンがUbuntuシステムにインストールされていること。PythonスクリプトをUbuntu上で実行する方法を学ぶには、How to run a Python script on Ubuntuに関する私たちのトレーニングを参照することができます。

Step 1 — フラスク環境の設定

Ubuntu 24.04はPython 3をデフォルトで提供しています。ターミナルを開いて、以下のコマンドを実行してPython 3のインストールを確認してください。

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

Python 3が既に machine 上にインストールされている場合、前述のコマンドは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

これは空のテキストエディタを開きます。ここにあなたのロジックを書いたり、以下のコードをコピーしたりします:

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, and DELETE。これらの方法は、持続的なストレージの4つの基本操作に対応しており、通常CRUD(作成、読み取り、更新、削除)と呼ばれます。

以下のルートをあなたのapp.pyのPythonスクリプトに追加してください:

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"}]

# 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 Imports: The code imports necessary components from Flask: Flask, jsonify, and request.

  • In-Memory Data Store: items is a simple list of dictionaries that acts as a temporary data store for the API. Each item has an id and a name.

  • GET /api/items: /api/itemsGETリクエストを行うと、サーバーはアイテムデータストア内のすべてのアイテムのリストを返却します。これは、コレクション内のすべてのリソースを取得するために便利です。

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

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

  • DELETE /api/items/<int:item_id>: 指定されたitem_idのアイテムをデータストアから削除するために、/api/items/<item_id>DELETEリクエストを使用します。アイテムの削除が成功した場合、サーバーは204 No Contentステータスコードを返却します。これは削除が成功し、返却する必要のない追加のコンテンツがないことを示します。

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

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

以下のコマンドを使用してFlaskサーバーを開始します。

root@ubuntu:~# python3 app.py

Flaskサーバーが以下の出力で运行中だと気づけます。

Output
* 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コマンドを順に実行します。

  • GET: curl http://127.0.0.1:5000/api/items
  • POST: curl -X POST -H "Content-Type: application/json" -d '{"name": "This is item 3"}' http://127.0.0.1:5000/api/items
  • PUT: curl -X PUT -H "Content-Type: application/json" -d '{"name": "This is updated item 1"}' http://127.0.0.1:5000/api/items/1
  • DELETE: curl -X DELETE http://127.0.0.1:5000/api/items/1

これらのコマンドの動作を見てみましょう。

root@ubuntu:~# curl http://127.0.0.1:5000/api/items
Output
[ { "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
Output
{ "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
Output
{ "id": 1, "name": "This is updated item 1" }

次に、更新されたアイテム1を見るためのGET要求を実行しましょう。

root@ubuntu:~# curl http://127.0.0.1:5000/api/items/1
Output
{ "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
Output
[ { "id": 2, "name": "This is item 2" }, { "id": 3, "name": "This is item 3" } ]

リストの第1アイテムは永久的に削除されています。

結び

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

Source:
https://www.digitalocean.com/community/tutorials/create-a-rest-api-using-flask-on-ubuntu