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

概要

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

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

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

FastAPI v0.68.1
Python v3.9.1

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

ルーティングの概念

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

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

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

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

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

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

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

main.py

from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional

app = FastAPI()

class User(BaseModel):
    name: str
    uses: Optional[int] = 0

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

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

@app.get("/users")
async def read_users():
    return users

@app.post("/users")
async def create_user(user: User):
    # ユーザーの作成処理など...
    users.append({"id": len(users) + 1, "name": user.name, "uses": user.uses})
    return users[-1]

@app.put("/users/{user_id}")
async def update_user(user_id: int, user: User):
    # ユーザーの更新処理など...
    for u in users:
        if u["id"] == user_id:
            u["name"] = user.name
            u["uses"] = user.uses
            return u
    return {"message": "User not found"}

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

解説

  • 必要なライブラリのインポート:
from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional

FastAPIは、APIを作成するための主要なクラスです。BaseModelはPydanticライブラリの一部で、入力データの検証、シリアライゼーション、ドキュメンテーション生成を行います。Optionalは型ヒントの一部で、ある値が省略可能であること(Noneを取りうること)を示します。

  • FastAPIアプリケーションのインスタンス化:
app = FastAPI()

appは、このFastAPIアプリケーションの新しいインスタンスを作成します。これはアプリケーションの主要なエントリーポイントで、ルーティング定義などの設定を行います。

  • Userモデルの定義:
class User(BaseModel):
    name: str
    uses: Optional[int] = 0

UserクラスはPydanticのBaseModelを継承します。これにより、データ検証とシリアライゼーションの機能が利用できます。ここでnameusesという2つのフィールドを定義しています。

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

usersは辞書のリストで、各ユーザーの情報を保持します。このサンプルコードでは、3人のユーザーの情報を初期値として持っています。

  • 特定のユーザーを取得するエンドポイント:
@app.get("/users/{user_id}")
async def read_user(user_id: int):
    for user in users:
        if user["id"] == user_id:
            return user
    return {"message": "User not found"}
  • 全ユーザーの情報を取得するエンドポイント:
@app.get("/users")
async def read_users():
    return users
  • 新規ユーザーを作成するエンドポイント:
@app.post("/users")
async def create_user(user: User):
    users.append({"id": len(users) + 1, "name": user.name, "uses": user.uses})
    return users[-1]
  • 既存のユーザー情報を更新するエンドポイント:
@app.put("/users/{user_id}")
async def update_user(user_id: int, user: User):
    for u in users:
        if u["id"] == user_id:
            u["name"] = user.name
            u["uses"] = user.uses
            return u
    return {"message": "User not found"}
  • ユーザー情報を削除するエンドポイント:
@app.delete("/users/{user_id}")
async def delete_user(user_id: int):
    for u in users:
        if u["id"] == user_id:
            users.remove(u)
            return {"message": f"User {user_id} has been deleted."}
    return {"message": "User not found"}

これらのエンドポイントはFastAPIのデコレータ機能を使用して定義され、HTTPメソッド(getpostputdelete)とURLパス(/users/{user_id}/users)を指定します。また、エンドポイントの関数には非同期処理を可能にするasyncキーワードが付けられています。

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

uvicorn main:app --reload

テスト

# GETリクエストのテスト
curl http://localhost:8000/users
# POSTリクエストのテスト
curl -X POST -H "Content-Type: application/json" -d '{"name":"John Doe"}' http://localhost:8000/users
# PUTリクエストのテスト
curl -X PUT -H "Content-Type: application/json" -d '{"name":"Jane Smith"}' http://localhost:8000/users/1
# DELETEリクエストのテスト
curl -X DELETE http://localhost:8000/users/1

まとめ

FastAPIでは、ルーティングをデコレータを使って簡単に定義できます。この記事では、FastAPIのルーティング処理の作成方法を紹介しました。具体的には、HTTPメソッドとURLパスの組み合わせで、クライアントからのリクエストがどのように処理されるかを定義しました。

また、GETメソッドを使って特定のユーザーの情報を取得し、“uses"情報も一緒に返す例を示しました。これにより、FastAPIを使って柔軟なAPIを作成する方法がわかったはずです。

FastAPIはモダンで、高速(Fast)、ウェブフレームワークで、Pythonのタイプヒントに基づいた強力な型システムを持っています。これにより、大規模なアプリケーションの開発も容易になります。