Web APIの構築に最適なPythonのWebフレームワーク「FastAPI」の特長や使い方を解説

普段のお仕事に役立つ普遍的なプログラミングTIPSや、業界で注目度が高い最新情報をお届けする「編集部ピックアップ」。
今回はPythonで効率的かつ高速にWeb APIを構築するためのWebフレームワーク「FastAPI」の特長と簡単なAPI構築のステップをご紹介します。

はじめに

FastAPIはその名前の通り高速かつ直感的なAPI開発を可能にするモダンなフレームワークです。この記事では、FastAPIの特長と簡単なCRUD処理を行うWeb API構築のステップをご紹介します。

FastAPIとは

FastAPIは、Pythonで構築されたモダンで高性能なWebフレームワークです。

主にWeb APIの開発に特化しており、その使いやすさとパフォーマンスの高さから、シンプルなアプリケーションから大規模なプロジェクトまで幅広く利用されています。

FastAPIはデータモデルのバリデーションとシリアライゼーションを行う「Pydantic」と、ルーティング、ミドルウェア、WebSocketなどの機能を提供するASGIフレームワーク「Starlette」を採用しており、これらによりNode.jsやGo並みの高いパフォーマンスを実現しています。
※ ASGI(Asynchronous Server Gateway Interface):非同期対応のPythonのWebサーバー、フレームワーク、アプリケーション間の通信の標準インターフェース

FastAPIの特長

高速なパフォーマンス

FastAPIはASGI(Asynchronous Server Gateway Interface)をベースにしており、非同期処理をネイティブサポートしています。データベースアクセスや外部APIの呼び出し中に他のリクエストを並行処理することが可能なので、従来の同期的なフレームワークに比べて、スケーラブルで応答性の高いアプリケーションを構築できます。

型アノテーションの活用

FastAPIはPythonの型アノテーション(Type Hints)を使用して、リクエストやレスポンスのデータバリデーションを自動化します。開発者は型を定義するだけで、データ整合性の検証が容易に行えるので、開発者体験も向上します。

自動ドキュメント生成

OpenAPI(旧Swagger)とReDocによるインタラクティブなAPIドキュメントが自動生成されるのでドキュメント作成の手間を削減できます。また、エンドポイントのテストやデバッグもドキュメント上で容易に実行できます。

開発効率の向上

FastAPIはデコレータを使ったルーティングや非同期I/Oサポートにより、少ないコード量で複雑な機能を実装できます。また、PydanticやStarletteなどのライブラリと統合されており、ユーザー認証やWebSocketサポートなども簡単に導入可能です。さらにエラー発生時に詳細なスタックトレースを出力してくれるので、デバッグも容易です。

FastAPIのユースケース

RESTful APIの構築

FastAPIは軽量で高性能なRESTful APIを構築するのに最適です。非同期処理をネイティブでサポートし、大量のリクエストを効率よく処理できるので、eコマースやソーシャルメディアアプリのバックエンドや、分散システムの各サービス間でのデータ交換を行うマイクロサービスなどで活用できます。

機械学習APIの公開

FastAPIは機械学習モデルをエンドユーザーに提供するためのAPIの開発にも適しています。リクエストが並列で処理されるため、リアルタイムでの機械学習予測や大量のAPIリクエストを効率よく処理できます。また、前述のPythonの型アノテーションとPydanticを組み合わせることでモデルに送られるデータのバリデーションチェックを簡単に実現できます。

リアルタイムアプリケーションの構築

FastAPIはWebSocketをサポートしているので、リアルタイムでのメッセージの送受信を行うチャットアプリや、動的に更新されるダッシュボードなどのリアルタイムアプリケーションを構築するのにも最適です。

使ってみよう!FastAPIクイックスタート

FastAPIの使い方を知るために、実際に簡単なWeb APIを作成して動かしてみましょう。

なお、FastAPIの実行にはPythonが必要なため、公式サイトからダウンロードしてインストールしておきましょう。

ダウンロードのリンクからインストーラーがダウンロードできますので、実行してインストールしましょう。

Python公式サイト

FastAPIで最小限のWeb APIの作成

まずは最小限の構成のWeb APIを作成していきます。まずはvenvを使って「fastapi-sample」という仮想環境を作成します。

python -m venv fastapi-sample

「fastapi-sample」フォルダに移動し、仮想環境を有効化します。

cd fastapi-sample
Scripts\activate

Pythonの実行環境が整ったら、FastAPIとASGI Webサーバの「Uvicorn」をpip経由でインストールします。

pip install fastapi uvicorn

プロジェクトのルートディレクトリに「main.py」のファイルを作り、下記のコードを記述します。

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello, FastAPI!"}

ファイル作成後、下記のコマンドを実行しWeb APIを起動します。

uvicorn main:app --reload 
FastAPIの起動

ブラウザで「http://127.0.0.1:8000/」にアクセスすると、「main.py」に定義したレスポンスが表示されます。

FastAPIの起動(2)

また、「http://127.0.0.1:8000/docs」にアクセスすると、自動生成されたOpenAPIのAPIドキュメントが使用できます。

自動生成されたOpenAPIのドキュメント

同様に「http://127.0.0.1:8000/redoc」にアクセスすると、自動生成されたReDocのAPIドキュメントが使用できます。

自動生成されたReDocのドキュメント

FastAPIでSQLiteと連携してCRUD処理を行うWeb APIの作成

次にPythonの標準データベースであるSQLiteと連携して、GET(参照)、POST(登録)、PUT(更新)、DELETE(削除)といったCRUD処理を行うWeb APIを作成してみます。まずはvenvを使って新しく「fastapi-user」という仮想環境を作成します。

python -m venv fastapi-user

「fastapi-user」フォルダに移動し、仮想環境を有効化します。

cd fastapi-user
Scripts\activate

先ほどと同様のFastAPIとUvicornに加え、Pythonで使えるORMの「SQLAlchemy」も一緒にインストールします。これにより、SQLを直接書くことなくデータベースを操作できます。

pip install fastapi uvicorn sqlalchemy

インストールが完了したらプロジェクトのルートに「app」フォルダを作成し、「__init__.py」ファイルを作成します(中身は空でOKです)。

__init__.pyファイルの配置

続けて同フォルダに「database.py」ファイルを作成し、データベース接続の設定を記載します。

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

DATABASE_URL = "sqlite:///./test.db"

engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

次に「models.py」を作成し、SQLAlchemyのモデル定義を記載します。

from sqlalchemy import Column, Integer, String
from .database import Base

class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True)
    name = Column(String)
    email = Column(String)

次に「schemas.py」を作成し、バリデーションなどを担うPydanticのスキーマ定義を記載します。

from pydantic import BaseModel

class User(BaseModel):
    name: str
    email: str

次に「crud.py」を作成し、CRUD処理を行うヘルパー関数の定義を記載します。

from sqlalchemy.orm import Session
from . import models, schemas

def get_user(id: int, db_session: Session):
    return db_session.query(models.User).filter(models.User.id == id).first()

def create_user(user: schemas.User, db: Session):
    db_user = models.User(name=user.name, email=user.email)
    db.add(db_user)
    db.commit()
    db.refresh(db_user)
    return db_user

def update_user(id: int, user: schemas.User, db: Session):
    db_user = get_user(id,db)
    db_user.name = user.name
    db_user.email = user.email
    db.commit()
    db.refresh(db_user)
    return db_user

def delete_user(id: int, db: Session):
    db_user = get_user(id,db)
    if db_user is None:
        return None
    db.delete(db_user)
    db.commit()
    return db_user

最後にアプリケーション本体の「main.py」を作成します。

from fastapi import Depends, FastAPI, HTTPException
from sqlalchemy.orm import Session
from . import crud, models, schemas
from .database import engine, get_db

models.Base.metadata.create_all(bind=engine)

app = FastAPI()

# ユーザーを全件取得
@app.get("/users/")
def read_users(db: Session = Depends(get_db)):
    users = db.query(models.User).all()
    return users

# ユーザーを1件取得
@app.get("/users/{user_id}")
def read_user(user_id: int, db: Session = Depends(get_db)):
    user = crud.get_user(user_id, db)
    return user

# ユーザーの登録
@app.post("/users/")
def create_user(user: schemas.User, db: Session = Depends(get_db)):
    return crud.create_user(user=user, db=db)

# ユーザーの更新
@app.put("/users/{user_id}")
def update_user(user_id: int, user: schemas.User, db: Session = Depends(get_db)):
    db_user = crud.update_user(id=user_id, user=user, db=db)
    if db_user is None:
        raise HTTPException(status_code=404, detail="User not found")
    return db_user

# ユーザーの削除
@app.delete("/users/{user_id}")
def delete_user(user_id: int, db: Session = Depends(get_db)):
    db_user = crud.delete_user(id=user_id, db=db)
    if db_user is None:
        raise HTTPException(status_code=404, detail="User not found")
    return db_user

動作確認

完成したら以下のコマンドでAPIを起動します。

uvicorn app.main:app --reload

起動後、「http://127.0.0.1:8000/docs」にアクセスすると、自動生成されたOpenAPIのAPIドキュメントが表示されます。

Users APIのOpenAPIドキュメント

APIドキュメント上で各種APIの動作を確認できます。まずはPOSTのAPIを実行しユーザーを登録します。

次にGETのAPI(「http://127.0.0.1:8000/users/1」)を実行し、今登録したユーザの情報を取得します。

以下のように「http://127.0.0.1:8000/users」でGETを実行すればユーザー情報の全件取得もできます。
※ あらかじめ何件かユーザー情報を登録しています。

次にPUTのAPI(「http://127.0.0.1:8000/users/1」)を実行し、ユーザの情報を更新します。

さらにDELETEのAPI(「http://127.0.0.1:8000/users/1」)を実行し、ユーザの情報を削除します。

再度「http://127.0.0.1:8000/users」のGETリクエストを実行し、正しくユーザー情報が削除されていることを確認します。

さいごに

本記事では、FastAPIの特長と導入方法、そして簡単なCRUD処理を行うWeb APIの作り方を解説しました。

FastAPIはPythonで手軽に高パフォーマンスなWeb APIを構築可能で、プロジェクトの規模を問わず、幅広い用途で使えるフレームワークですので、是非お試しいただければ幸いです。

メシウスではFastAPIで作成したWeb APIとも連携可能な、業務アプリのフロントエンド開発に使える高機能なJavaScriptライブラリを提供しています。

メシウスのJavaScriptライブラリ

無償のトライアル版や、ブラウザ上で手軽に試せるデモアプリケーションも公開しているので、こちらも是非ご覧ください。

\  この記事をシェアする  /