Flaskでルーティング処理を作成する方法

概要

Flaskは、簡単にルーティングを定義できる機能を提供しています。
ルーティングは、HTTPリクエストを処理するためのエンドポイントを指定することで定義されます。

以下では、ルーティングの概念、ルートの定義、ルートハンドラの作成、ルーティングパラメータの処理、およびルートのオプションについて詳しく説明します。

ここでは、以下バージョンを使用した、ルーティング方法を説明します。

Flask v2.0.2
Python v3.9.1

また、今回作成するコードは全て、GitHubに掲載しています。

ルーティングの概念

ルーティングは、クライアントからのリクエストが特定のエンドポイントに到達した際に、Flaskアプリケーションがどのように処理するかを定義します。

ルーティングは、HTTPメソッド(GET、POST、PUT、DELETEなど)とパス(URL)の組み合わせで定義されます。

ルーティング処理を作成する方法

Flaskでは、デコレータを使用してルーティングを定義します。

@app.route('<パス>', methods=['<HTTPメソッド>'])
def <関数名>(<引数>):
  # ルートの処理
  • HTTPメソッド: HTTPリクエストのメソッドを指定します(例: ‘GET’、‘POST’、‘PUT’、‘DELETE’など)。
  • パス: クライアントからのリクエストがマッチするURLパスを指定します。
  • <関数名>: ルートの処理を行う関数を定義します。
  • <引数>: 必要に応じて関数の引数を定義します。パスパラメータやクエリパラメータ、リクエストボディなどがここに該当します。

以下に具体的なコード例を示します。

各種APIメソッドを作成する方法

app.py

from flask import Flask, jsonify, request

app = Flask(__name__)

# ユーザー情報を保持する仮のデータ
users = [
    {"id": 1, "name": "John Doe", "uses": 5},
    {"id": 2, "name": "Jane Doe", "uses": 3},
    {"id": 3, "name": "Jim Doe", "uses": 7},
]

@app.route("/users/<int:user_id>", methods=['GET'])
def read_user(user_id):
    # ユーザー情報の取得処理など...
    for user in users:
        if user["id"] == user_id:
            return jsonify(user)
    return jsonify({"message": "User not found"})

@app.route("/users", methods=['GET'])
def read_users():
    return jsonify(users)

@app.route("/users", methods=['POST'])
def create_user():
    # ユーザーの作成処理など...
    user = request.get_json()
    users.append({"id": len(users) + 1, "name": user["name"], "uses": user["uses"]})
    return jsonify(users[-1])

@app.route("/users/<int:user_id>", methods=['PUT'])
def update_user(user_id):
    # ユーザーの更新処理など...
    user = request.get_json()
    for u in users:
        if u["id"] == user_id:
            u["name"] = user["name"]
            u["uses"] = user["uses"]
            return jsonify(u)
    return jsonify({"message": "User not found"})

@app.route("/users/<int:user_id>", methods=['DELETE'])
def delete_user(user_id):
    # ユーザーの削除処理など...
    for u in users:
        if u["id"] == user_id:
            users.remove(u)
            return jsonify({"message": f"User {user_id} has been deleted."})
    return jsonify({"message": "User not found"})

以下のコマンドでFlaskアプリケーションを起動しておく必要があります:

export FLASK_APP=app.py
flask run

テスト

# GETリクエストのテスト
curl http://localhost:5000/users

# POSTリクエストのテスト
curl -X POST -H "Content-Type: application/json" -d '{"name":"New User", "uses": 10}' http://localhost:5000/users

# 単一ユーザーのGETリクエストのテスト
curl http://localhost:5000/users/1

# PUTリクエストのテスト
curl -X PUT -H "Content-Type: application/json" -d '{"name":"Updated User", "uses": 15}' http://localhost:5000/users/1

# DELETEリクエストのテスト
curl -X DELETE http://localhost:5000/users/1

上記の各コマンドは、作成したFlask APIのエンドポイントをテストします。 curl コマンドは、HTTPリクエストを送信するためのコマンドラインツールです。

-X フラグは、送信するHTTPメソッドを指定します。 -H フラグは、リクエストヘッダーを設定します。 -d フラグは、リクエストボディを設定します。

このテストでは、まず全てのユーザー情報を取得します。次に新しいユーザーを作成します。その後、特定のユーザーの詳細情報を取得し、そのユーザーの情報を更新し、最後にそのユーザーを削除します。

注意点としては、削除したユーザーに再度アクセスしようとすると、「User not found」のメッセージが返ってくることを確認してください。

これで、Flaskでルーティング処理を作成する基本的な方法を学びました。これを応用して、より複雑なルーティングを作成することが可能です。

まとめ

この記事では、Flaskを使用してRESTful APIを作成し、テストを行う方法について説明しました。また、curl コマンドを使用してAPIのエンドポイントをテストする基本的な手順も説明しました。

それぞれのリクエスト方法について詳しく見てきましたが、これらは基本的な方法であり、実際のアプリケーションではより複雑な処理が必要となることが多いです。

今後は、この知識を応用し、より多機能なAPIの作成や、エラーハンドリング、データの検証といった高度な技術へと進んでいきましょう。また、実際に開発を行う際には、適切なテストを行い、予期しないバグや問題が発生しないように注意することが重要です。

Flaskはそのシンプルさと柔軟性から人気のあるWebフレームワークですが、しっかりと理解して使用しなければなりません。この記事が、FlaskとRESTful APIの基本的な理解に役立つことを願っています。