※本記事には広告(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
学習曲線 😊 緩やか 😊 非常に緩やか 😰 急
規模の柔軟性 小規模〜中規模に最適 小規模に最適 中規模〜大規模向け

広告・楽天アフィリエイト

開発者向けガジェット

PC周辺機器を楽天市場でチェック。

楽天ポイント還元

楽天市場を見る →

👉 FastAPIで作ったAPIを本番公開するなら、月額1,000円台のVPSがおすすめです。

楽天市場で見る

広告

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の流儀。リクエストごとにセッションを開閉し、自動でクローズされるため、リソースリークの心配がありません。

🚀 FastAPIアプリを24時間稼働させるなら、安定したVPSが必須です。

楽天市場で見る

広告

非同期処理で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へのデプロイ手順

  1. VPSを契約(ConoHa VPSなら月額880円〜、XServer VPSなら月額1,046円〜)
  2. SSH接続してDocker + Docker Composeをインストール
  3. GitHubからコードをクローン
  4. .envファイルでSECRET_KEYやDB接続情報を設定
  5. docker compose up -dで起動
  6. 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で作ったアプリを24時間安定稼働させるなら、VPSが一番コスパ良し

楽天市場で見る

広告

まとめ:個人開発者が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円〜)なら、個人開発の予算でも気軽に始められます。

🔧 FastAPIの学習をもっと深めたい方は、PythonのAPI設計と合わせて学ぶのがおすすめ

楽天市場で見る

広告

広告・楽天アフィリエイト

メカニカルキーボード

打鍵感で選ぶ開発者向けキーボード。

楽天ポイント還元

キーボードを楽天で見る →
楽天市場で見る