※本記事には広告(A8・楽天アフィリエイト)リンクが含まれる場合があります。
「PythonでAPIサーバーを作りたいけど、Flaskは古くさいし、Djangoは大げさすぎる」「高速なパフォーマンスと自動ドキュメント生成が欲しい」——そんな個人開発者の悩みを一気に解決してくれるのがFastAPIです。
FastAPIは2018年の登場以降、PythonのWebフレームワーク市場で急速にシェアを拡大。2026年現在ではPython API開発のデファクトスタンダードとして認知されています。Node.jsのExpressやGoの標準ライブラリに匹敵するパフォーマンスを誇りながら、Pythonの書きやすさをそのまま活かせるのが最大の魅力です。
この記事では、FastAPIをこれから始める個人開発者向けに、インストールから実践的なAPI構築、データベース連携、認証、デプロイまでを完全解説します。サンプルコードはすべてコピペで動くので、ぜひ手を動かしながら試してみてください。
FastAPIとは?なぜ個人開発者に最適なのか
FastAPIは、Python 3.8+に対応したモダンなWebフレームワークです。以下の特徴により、個人開発者に圧倒的に支持されています。
- 高速:Node.jsやGoに匹敵するパフォーマンス(Starletteベースの非同期処理)
- 自動ドキュメント生成:OpenAPI(Swagger)ドキュメントがコードから自動生成される
- 型安全:Pythonの型ヒントでリクエスト/レスポンスのバリデーションが完結
- 非同期対応:async/awaitで高並列処理が可能
- 学習コストが低い:Flaskに近いシンプルな構成だが、Django並みの高機能
さらに、Pydantic v2によるデータバリデーション、SQLAlchemy 2.0とのシームレスな連携、JWT認証の簡単実装など、個人開発で必要となる機能が標準的に備わっているのも大きなポイントです。
| 項目 | FastAPI | Flask | Django |
|---|---|---|---|
| パフォーマンス | ⭐ 非常に高速 | ⭐ 普通 | ⭐ 普通 |
| 非同期対応 | ✅ 標準対応 (async/await) | ❌ 別途拡張が必要 | ✅ 対応 (v4以降) |
| 自動APIドキュメント | ✅ 標準装備 (Swagger + ReDoc) | ❌ Flask-RESTx等が必要 | ❌ DRF + drf-spectacular |
| 型バリデーション | ✅ Pydantic v2(型ヒント連携) | ❌ 別途Marshmallow等 | ❌ DRF Serializer |
| 学習曲線 | 😊 緩やか | 😊 非常に緩やか | 😰 急 |
| 規模の柔軟性 | 小規模〜中規模に最適 | 小規模に最適 | 中規模〜大規模向け |
FastAPIのセットアップ
インストール
まずはPython 3.8以上がインストールされていることを確認してください。仮想環境を作成してFastAPIをインストールします。
# 仮想環境の作成
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# FastAPIのインストール(本番サーバー: uvicornも一緒に)
pip install "fastapi[standard]" uvicorn
Hello World API
最もシンプルなAPIはたった数行で書けます。
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, FastAPI!"}
@app.get("/health")
def health_check():
return {"status": "ok", "version": "1.0.0"}
# 起動
uvicorn main:app --reload --host 0.0.0.0 --port 8000
--reloadオプションをつけると、コードを変更するたびに自動でホットリロードされます。開発中は必須のオプションです。
起動後、http://localhost:8000/docsにアクセスすると、Swagger UIによるインタラクティブなAPIドキュメントが自動生成されているのを確認できます。コードを1行も書かずに、リクエストのテストができる画面が表示される——これがFastAPIの最大の魅力のひとつです。
Pydantic v2で型安全なAPI設計
FastAPIの核となるのがPydanticです。Pythonの型ヒントを使って、リクエストボディやレスポンスのバリデーションを宣言的に記述できます。
from pydantic import BaseModel, Field
from typing import Optional
from datetime import datetime
class TaskCreate(BaseModel):
title: str = Field(..., min_length=1, max_length=100, description="タスクのタイトル")
description: Optional[str] = Field(None, max_length=1000)
priority: int = Field(default=1, ge=1, le=5)
due_date: Optional[datetime] = None
class TaskResponse(BaseModel):
id: int
title: str
description: Optional[str]
priority: int
completed: bool
created_at: datetime
updated_at: datetime
@app.post("/tasks", response_model=TaskResponse)
def create_task(task: TaskCreate):
# task.title, task.description などは自動バリデーション済み
new_task = create_task_in_db(task)
return new_task
ポイントは、Field(..., min_length=1)のようにバリデーションルールを型ヒントの延長で書けること。不正なリクエストが来た場合、FastAPIが自動的に422 Unprocessable Entityを返してくれます。自分でバリデーションロジックを書く必要はありません。
データベース連携(SQLAlchemy 2.0)
実用的なAPIにはデータベースが欠かせません。FastAPIではSQLAlchemy 2.0が標準的に使われています。ここではSQLiteを使ったシンプルな構成を紹介します。
# database.py
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, DeclarativeBase
DATABASE_URL = "sqlite:///./app.db"
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
class Base(DeclarativeBase):
pass
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
# models.py
from sqlalchemy import Column, Integer, String, Boolean, DateTime, Text
from datetime import datetime, timezone
from database import Base
class Task(Base):
__tablename__ = "tasks"
id = Column(Integer, primary_key=True, index=True)
title = Column(String(100), nullable=False)
description = Column(Text, nullable=True)
priority = Column(Integer, default=1)
completed = Column(Boolean, default=False)
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
updated_at = Column(DateTime, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc))
# main.py(CRUDの実装)
from fastapi import Depends, HTTPException
from sqlalchemy.orm import Session
from database import get_db
from models import Base, Task
from pydantic import BaseModel
# テーブル作成
Base.metadata.create_all(bind=engine)
@app.get("/tasks", response_model=list[TaskResponse])
def list_tasks(skip: int = 0, limit: int = 10, db: Session = Depends(get_db)):
tasks = db.query(Task).offset(skip).limit(limit).all()
return tasks
@app.get("/tasks/{task_id}", response_model=TaskResponse)
def get_task(task_id: int, db: Session = Depends(get_db)):
task = db.query(Task).filter(Task.id == task_id).first()
if not task:
raise HTTPException(status_code=404, detail="Task not found")
return task
@app.put("/tasks/{task_id}", response_model=TaskResponse)
def update_task(task_id: int, task_data: TaskCreate, db: Session = Depends(get_db)):
task = db.query(Task).filter(Task.id == task_id).first()
if not task:
raise HTTPException(status_code=404, detail="Task not found")
for key, value in task_data.model_dump().items():
setattr(task, key, value)
db.commit()
db.refresh(task)
return task
@app.delete("/tasks/{task_id}")
def delete_task(task_id: int, db: Session = Depends(get_db)):
task = db.query(Task).filter(Task.id == task_id).first()
if not task:
raise HTTPException(status_code=404, detail="Task not found")
db.delete(task)
db.commit()
return {"message": "Task deleted"}
SQLAlchemy 2.0のポイントは、DeclarativeBaseを使った新しい宣言スタイルと、型安全なAPIです。Depends(get_db)で依存性注入(DI)を使ってデータベースセッションを管理するのがFastAPIの流儀。リクエストごとにセッションを開閉し、自動でクローズされるため、リソースリークの心配がありません。
非同期処理でAPIを高速化
FastAPIの真骨頂は非同期処理です。データベースや外部APIの待ち時間に他のリクエストを処理できるため、パフォーマンスが大幅に向上します。
import httpx
from fastapi import FastAPI
app = FastAPI()
# 同期処理
@app.get("/sync-example")
def sync_endpoint():
import time
time.sleep(2) # 2秒ブロック
return {"message": "sync done"}
# 非同期処理
@app.get("/async-example")
async def async_endpoint():
import asyncio
await asyncio.sleep(2) # ブロックしない
return {"message": "async done"}
# 外部API呼び出しの非同期版
@app.get("/github-user/{username}")
async def get_github_user(username: str):
async with httpx.AsyncClient() as client:
response = await client.get(f"https://api.github.com/users/{username}")
return response.json()
同期APIは1リクエストに2秒かかるため、10リクエストが同時に来ると20秒かかります。非同期APIなら、待ち時間の間に他のリクエストを処理できるため、10リクエストが同時に来ても約2秒で完了します。I/Oバウンドな処理(DBクエリ、ファイル読み書き、外部API呼び出し)では特に効果を発揮します。
JWT認証の実装
APIに認証を追加するのは、FastAPIなら驚くほど簡単です。ここではJWT(JSON Web Token)を使った認証を実装します。
# auth.py
from datetime import datetime, timedelta, timezone
from jose import JWTError, jwt
from passlib.context import CryptContext
from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
SECRET_KEY = "your-secret-key-here" # 本番では.envから読み込む
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
def verify_password(plain_password, hashed_password):
return pwd_context.verify(plain_password, hashed_password)
def get_password_hash(password):
return pwd_context.hash(password)
def create_access_token(data: dict, expires_delta: timedelta | None = None):
to_encode = data.copy()
expire = datetime.now(timezone.utc) + (expires_delta or timedelta(minutes=15))
to_encode.update({"exp": expire})
return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
def get_current_user(token: str = Depends(oauth2_scheme)):
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
username: str = payload.get("sub")
if username is None:
raise HTTPException(status_code=401, detail="Invalid token")
return username
except JWTError:
raise HTTPException(status_code=401, detail="Invalid token")
# main.py に追加
@app.post("/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
# DBからユーザー検証
user = get_user_from_db(form_data.username)
if not user or not verify_password(form_data.password, user.hashed_password):
raise HTTPException(status_code=401, detail="Incorrect credentials")
access_token = create_access_token(data={"sub": user.username})
return {"access_token": access_token, "token_type": "bearer"}
@app.get("/users/me")
async def read_users_me(current_user: str = Depends(get_current_user)):
return {"username": current_user}
python-joseでJWTの発行・検証、passlib + bcryptでパスワードのハッシュ化を行います。OAuth2PasswordBearerを使うと、Swagger UIに自動で「Authorize」ボタンが追加され、トークンを入力してテストできるようになります。これもFastAPIならではの便利さです。
Dockerで本番デプロイ
開発したFastAPIアプリを本番環境にデプロイするには、Dockerを使うのが最も一般的かつ信頼性の高い方法です。
# Dockerfile
FROM python:3.12-slim
WORKDIR /app
# 依存パッケージのインストール
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# アプリケーションコード
COPY . .
# 本番起動(ワーカー数4)
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]
# requirements.txt
fastapi[standard]
uvicorn[standard]
sqlalchemy>=2.0
pydantic>=2.0
python-jose[cryptography]
passlib[bcrypt]
httpx
python-multipart
# docker-compose.yml(本番構成例)
version: "3.9"
services:
app:
build: .
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql+psycopg://user:pass@db:5432/app
- SECRET_KEY=${SECRET_KEY}
depends_on:
- db
restart: always
db:
image: postgres:16-alpine
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=app
restart: always
volumes:
postgres_data:
Docker Composeを使えば、FastAPIアプリ + PostgreSQL + 環境変数の管理を1つの設定ファイルにまとめられます。VPSにdocker compose up -dするだけで本番環境が立ち上がるため、デプロイの手間が圧倒的に減ります。
VPSへのデプロイ手順
- VPSを契約(ConoHa VPSなら月額880円〜、XServer VPSなら月額1,046円〜)
- SSH接続してDocker + Docker Composeをインストール
- GitHubからコードをクローン
.envファイルでSECRET_KEYやDB接続情報を設定docker compose up -dで起動- NginxやCaddyでリバースプロキシ+HTTPS化
リバースプロキシにはCaddyがおすすめです。自動HTTPS(Let's Encrypt)を標準サポートしており、設定も数行で完了します。
# Caddyfile
api.yourdomain.com {
reverse_proxy localhost:8000
}
FastAPI + AI 連携(2026年の最新トレンド)
2026年現在、FastAPIはAI/LLM連携のバックエンドとしても大活躍しています。OpenAI APIやローカルLLM(Llama.cpp、Ollama)をラップしたAPIサーバーとして使うケースが急増中です。
from openai import OpenAI
from pydantic import BaseModel
client = OpenAI()
class ChatRequest(BaseModel):
messages: list[dict]
model: str = "gpt-4o-mini"
temperature: float = 0.7
@app.post("/chat")
async def chat(req: ChatRequest):
response = client.chat.completions.create(
model=req.model,
messages=req.messages,
temperature=req.temperature,
)
return {"reply": response.choices[0].message.content}
@app.post("/chat/stream")
async def chat_stream(req: ChatRequest):
"""ストリーミング応答"""
stream = client.chat.completions.create(
model=req.model,
messages=req.messages,
stream=True,
)
async def generate():
for chunk in stream:
if chunk.choices[0].delta.content:
yield f"data: {chunk.choices[0].delta.content}\n\n"
yield "data: [DONE]\n\n"
from fastapi.responses import StreamingResponse
return StreamingResponse(generate(), media_type="text/event-stream")
FastAPIの非ストリーミングとストリーミングの両方に対応したエンドポイントを、わずか20行で実装できます。個人開発者がAI機能をAPIとして公開したい場合、FastAPIは最適な選択肢です。
FastAPI × フロントエンド連携
FastAPIの生成するOpenAPI仕様は、フロントエンドとの連携でも力を発揮します。OpenAPI Generatorを使えば、TypeScriptのAPIクライアントを自動生成できます。
# OpenAPI仕様をJSONで出力(自動生成)
# http://localhost:8000/openapi.json にアクセス
# TypeScriptクライアントを自動生成
npx @openapitools/openapi-generator-cli generate \
-i http://localhost:8000/openapi.json \
-g typescript-fetch \
-o src/api/generated
これにより、フロントエンド(React / Next.js / Vue)とバックエンド(FastAPI)の型が完全に一致し、型安全なフルスタック開発が実現します。バックエンドでスキーマを変更すれば、自動生成したTypeScriptの型も即座に反映されるため、結合時の不整合に悩まされることがありません。
FastAPIの注意点と向き不向き
FastAPIは万能ではありません。以下の点を理解した上で採用を検討しましょう。
向いているケース
- ✅ RESTful APIを高速に開発したい
- ✅ 自動ドキュメント生成が欲しい
- ✅ 非同期処理でパフォーマンスを最大限引き出したい
- ✅ AI/LLM連携のバックエンドを作りたい
- ✅ マイクロサービス構成の一部として使いたい
- ✅ Pythonエコシステム(Pandas, NumPy, scikit-learn)と連携したい
向いていないケース
- ❌ 大規模なフルスタックWebアプリケーション(Djangoの方が適切)
- ❌ 管理画面込みのCMS(Django Adminに敵わない)
- ❌ チーム全員がPythonを書けない(型安全を活かせない)
- ❌ WebSocket主体のリアルタイムアプリ(より専門的なフレームワークが必要)
まとめ:個人開発者がFastAPIを選ぶ3つの理由
FastAPIは、2026年現在、個人開発者がPythonでAPIを構築するなら最良の選択です。その理由を3つにまとめます。
1. 開発速度が桁違い
型ヒントによる自動バリデーションと自動ドキュメント生成により、FlaskやDjangoと比べて開発工数が大幅に減ります。コード量が減る ≠ 品質が落ちる、むしろバグが減ります。
2. パフォーマンスに妥協がない
Starletteベースの非同期処理により、Node.jsやGoに匹敵するパフォーマンスをPythonで実現できます。個人開発の段階では、スケーリングを全く気にしなくて済むレベルです。
3. AI時代との相性が抜群
2026年の今、APIの多くはAI/LLMと連携します。FastAPIはOpenAI APIのラッピング、ストリーミング応答、バッチ処理など、AI機能を実装する上で必要な機能をすべて備えています。
まずはローカルで動かしてみてください。pip install fastapi uvicornの1行から始まり、10分後にはSwagger UIでAPIをテストできる——それがFastAPIの世界です。
本番公開にはVPSが最適です。ConoHa VPS(月額880円〜)やXServer VPS(月額1,046円〜)なら、個人開発の予算でも気軽に始められます。