FastAPI 基本アーキテクチャと非同期処理

AIアプリケーション、ウェブスクレイピング、データサイエンスを扱う場合、Pythonは間違いなく主力言語です。しかし従来、PythonでバックエンドAPIサーバーを構築する場合、選択肢は主に2つしかありませんでした:

  1. Django:過度に重厚で、不要なシステムが多数含まれています。
  2. Flask:軽量ですが、組み込みのデータ検証がなく、非同期(Async)処理のサポートも不十分でした。

ここに登場したのがFastAPIです。

FastAPIは現在Pythonで最も成長が速いWebフレームワークです。その名の通り、「高速」が特徴です。実行速度が速い(StarletteとPydanticを基盤としており、Node.jsやGoに匹敵する性能)だけでなく、「開発速度も速く」、Swagger APIドキュメントを自動生成できます。

このレッスンでは、最初のFastAPIマイクロサービスを構築しましょう!

1. 環境設定とインストール

まず、クリーンなPython仮想環境が必要です。ターミナルを開いて:

# 仮想環境作成 (Mac/Linux)
python3 -m venv venv
source venv/bin/activate

# 仮想環境作成 (Windows)
python -m venv venv
venv\Scripts\activate

次に、FastAPIと専用サーバーエンジンuvicornをインストール:

pip install fastapi "uvicorn[standard]"

[!TIP] Uvicornとは? Uvicornは lightning-fastなASGI (Asynchronous Server Gateway Interface)サーバーです。FastAPIがロジックを処理し、Uvicornがポートを監視してHTTPリクエストを非同期にFastAPIに転送します。

2. 最初のHello World APIを作成

プロジェクトディレクトリにmain.pyファイルを作成:

from fastapi import FastAPI

# FastAPIインスタンス作成
app = FastAPI(
    title="Vibe Tutor AI マイクロサービスAPI",
    description="FastAPIで構築した最初のバックエンドサーバーです!",
    version="1.0.0"
)

# GETルートを定義
@app.get("/")
async def root():
    return {"message": "Hello World! FastAPIの世界へようこそ。"}

# パスパラメータ付きルートを定義
@app.get("/users/{user_id}")
async def read_user(user_id: int):
    return {"user_id": user_id, "status": "active"}

これだけです!複雑な設定ファイルなしで、Pythonのデコレータ@app.getを使ってルートを定義できます。

3. サーバー起動とホットリロード

ターミナルで以下を実行してサーバーを起動:

uvicorn main:app --reload
  • mainmain.pyファイルを指します
  • app:コード内で作成したapp = FastAPI()インスタンスを指します
  • --reload:開発時の強力な味方!コードを変更保存すると、サーバーが即座に自動再起動します

Uvicorn running on http://127.0.0.1:8000と表示されれば成功です!

4. 自動生成OpenAPIドキュメント (Swagger UI)

FastAPIで最も開発者に愛されている機能です。 ブラウザで以下を開いてください: 👉 http://127.0.0.1:8000/docs

美しいSwagger UIインターフェースが表示されます! FastAPIがコードを自動解析し、画面上で直接テスト可能なインタラクティブなAPIドキュメントを生成します。

Postmanの設定を一行も書く必要なく、フロントエンドエンジニア(またはNext.jsアプリケーション)が直接このドキュメントを見てAPI連携できます。http://127.0.0.1:8000/redocでは別スタイルのドキュメントも確認できます。

5. なぜasync defを使うのか?(非同期処理)

関数宣言で従来のdefではなくasync defを使用していることに気付いたでしょう。

これがFastAPIがFlaskを性能で圧倒する核心的な秘密です:非同期(Asynchronous)処理

従来、APIが遅いタスク(例:OpenAI APIを呼び出して記事を生成するのに10秒かかる)を実行中の場合、サーバー全体が「ブロック」され、他のユーザーのリクエストは待たされるしかありませんでした。

async / awaitを使用すると、サーバーがOpenAIの応答を待つ10秒間、制御を解放して他のユーザーリクエストを処理できます。これにより、FastAPIは最小限のハードウェアリソースで高い並列処理を実現します。

import asyncio
from fastapi import FastAPI

app = FastAPI()

@app.get("/generate-ai-text")
async def generate_text():
    # 5秒待機するAI生成タスクを模擬
    print("生成開始...")
    await asyncio.sleep(5)  # 注意:await必須
    print("生成完了!")
    
    return {"result": "これはAIが生成した超クールな文章です。"}

[!WARNING] ブロッキング関数は絶対に使わないでください! async def内で従来のtime.sleep(5)や同期型requests.get()を使用すると、サーバー全体がブロックされます!非同期版関数(asyncio.sleephttpxパッケージなど)を使用する必要があります。どうしても同期関数を使う必要がある場合は、従来のdefで宣言してください。FastAPIは自動的にThreadPoolで実行します。

次の章では、FastAPIのもう一つの核心機能:Pydanticデータ検証を探求します。これにより、if request.get("name") is Noneのような苦痛なコードを書く必要がなくなります!

会員限定無料チュートリアル

このチャプターは登録会員限定の無料コンテンツです!ログインまたは登録してすぐにロックを解除してください。

今すぐログイン / 登録