FastAPI 基本アーキテクチャと非同期処理
AIアプリケーション、ウェブスクレイピング、データサイエンスを扱う場合、Pythonは間違いなく主力言語です。しかし従来、PythonでバックエンドAPIサーバーを構築する場合、選択肢は主に2つしかありませんでした:
- Django:過度に重厚で、不要なシステムが多数含まれています。
- 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
main:main.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.sleepやhttpxパッケージなど)を使用する必要があります。どうしても同期関数を使う必要がある場合は、従来のdefで宣言してください。FastAPIは自動的にThreadPoolで実行します。
次の章では、FastAPIのもう一つの核心機能:Pydanticデータ検証を探求します。これにより、if request.get("name") is Noneのような苦痛なコードを書く必要がなくなります!