【FastAPI入門】使い方を実例で解説!初心者でも安心のAPI開発ガイド

kento_morota 19分で読めます

FastAPIとは?初心者が知っておくべき基礎知識

「APIを作りたいけど、どのフレームワークを選べばいいかわからない」――そんな悩みをお持ちではないでしょうか。

FastAPIは、Pythonで高速かつモダンなWeb APIを構築できるフレームワークです。2018年の登場以来、自動ドキュメント生成Pythonの基礎知識があれば短期間で習得できる学習曲線の緩やかさから、世界中の開発者に選ばれています。

中小企業のIT担当者にとって、FastAPIは「大きすぎず、小さすぎない、ちょうどいい」選択肢です。小規模な社内ツールから始めて、段階的に業務システムへ拡張できる柔軟性を持っています。

FastAPIの特徴と選ばれる理由

FastAPIは他のPythonフレームワークと比較して、際立った特徴があります。

主な特徴:

  • 高速なパフォーマンス: NodeJSやGoに匹敵する処理速度
  • 自動ドキュメント生成: Swagger UIとReDocが自動作成される
  • 型ヒントベース: Python 3.6以降の型ヒントを活用
  • 自動バリデーション: 入力データの検証が自動的に実行
  • 非同期処理対応: async/awaitによる効率的な処理

他フレームワークとの比較:

フレームワーク 速度 学習難易度 ドキュメント 最適用途
FastAPI 高速 中程度 自動生成 API開発
Django 中速 やや高い 手動 フルスタック
Flask 中速 低い 手動 小規模API

選ばれる理由:

  1. 開発スピードの向上: 自動バリデーションとドキュメント生成により、開発時間を30〜40%削減
  2. バグの早期発見: 型ヒントによってエディタ上でエラーを事前検出
  3. API仕様の明確化: Swagger UIで最新のAPI仕様を確認でき、チーム連携がスムーズ
  4. 充実したコミュニティ: GitHubで60,000以上のスターを獲得

FastAPIが向いている開発シーンと業務活用

最適な開発シーン:

  • マイクロサービスの構築: 特定機能に特化した小規模APIサービス
  • モバイルアプリのバックエンド: iOS/Androidアプリのデータ提供API
  • SPAのバックエンド: React、Vue.jsなどと連携
  • 社内業務ツールのAPI化: Excel管理からの脱却、業務システムの段階的構築
  • 機械学習モデルのAPI化: PythonのMLモデルをWeb APIとして公開

中小企業の業務システムに適している理由:

  1. 段階的な導入が可能: まず在庫管理APIから始めて、徐々に顧客管理、請求管理と拡張
  2. 開発コストの削減: 従来の開発費の1/3〜1/2程度での構築が可能
  3. 内製化への第一歩: Pythonの基礎知識があれば、社内でのシステム内製化の足がかりに
  4. 既存システムとの連携: RESTful API設計により、Excel、kintone、Salesforceなど様々なシステムと連携しやすい

Harmonic Societyでは、FastAPIを活用した業務システム構築を1〜3週間の短期間で実現しています。

環境構築とインストール

FastAPIの開発を始めるには、適切な環境構築が重要です。ステップバイステップで解説します。

必要な環境とインストール

必須要件:

  • Python 3.7以上(推奨は3.9以上)
  • pip(Pythonパッケージ管理ツール)
  • テキストエディタまたはIDE

Pythonのバージョン確認:

python --version

FastAPIのインストール:

# pipを最新版にアップデート
python -m pip install --upgrade pip

# FastAPIとuvicornをインストール
pip install fastapi
pip install "uvicorn[standard]"
  • fastapi: フレームワーク本体
  • uvicorn: ASGIサーバー(FastAPIアプリケーションの実行に必要)

仮想環境の作成

仮想環境は、プロジェクトごとに独立したPython環境を作る仕組みです。パッケージの競合を避けるため、必ず使用しましょう。

venvを使った方法:

# プロジェクトディレクトリを作成
mkdir my-fastapi-project
cd my-fastapi-project

# 仮想環境を作成
python -m venv venv

# 仮想環境を有効化
# Windows
venv\Scripts\activate
# macOS/Linux
source venv/bin/activate

# この環境内でFastAPIをインストール
pip install fastapi uvicorn

# 依存関係を記録
pip freeze > requirements.txt

開発に便利なツール

推奨エディタ:

Visual Studio Code(VS Code)

必須拡張機能:
- Python(Microsoft公式)
- Pylance(型チェックとインテリセンス)
- REST Client(API動作確認用)

便利なツール:

  • Postman: API動作確認ツール(GUIで使いやすい)
  • Git: バージョン管理(必須)

はじめてのFastAPI実装

環境構築が完了したら、実際にAPIを作成してみましょう。

Hello Worldから始める

main.pyを作成:

from fastapi import FastAPI

app = FastAPI()

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

たった5行でAPIが完成しました。

もう少し実用的な例:

from fastapi import FastAPI
from datetime import datetime

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Welcome to FastAPI", "timestamp": datetime.now()}

@app.get("/hello/{name}")
def say_hello(name: str):
    return {"message": f"Hello, {name}!"}

サーバーの起動と動作確認

uvicornでサーバーを起動:

uvicorn main:app --reload
  • main: ファイル名(main.py)
  • app: FastAPIインスタンスの変数名
  • --reload: ファイル変更時に自動再起動(開発時のみ使用)

ブラウザでアクセス:

http://127.0.0.1:8000にアクセスすると、JSONが表示されます。

http://127.0.0.1:8000/hello/Taroでパスパラメータも試せます。

自動生成ドキュメントの確認

FastAPIの最大の特徴の一つが、自動ドキュメント生成です。

Swagger UIにアクセス:

http://127.0.0.1:8000/docsを開くと、インタラクティブなドキュメントが表示されます。

  • すべてのエンドポイントの一覧表示
  • 各エンドポイントのパラメータ確認
  • Try it outボタンでブラウザから直接APIをテスト
  • レスポンスの確認

ドキュメントのカスタマイズ:

app = FastAPI(
    title="社内業務API",
    description="在庫管理と顧客管理のためのAPI",
    version="1.0.0"
)

この自動ドキュメントは、チームメンバーとの連携に非常に有効で、別途API仕様書を作成する必要がなく、開発工数を大幅に削減できます。

FastAPIの基本的な使い方

実務で使う主要な機能を実例とともに学んでいきましょう。

GETリクエストの実装

GETリクエストは、データを取得する際に使用します。

基本的なGETリクエスト:

from fastapi import FastAPI

app = FastAPI()

@app.get("/items")
def get_items():
    items = [
        {"id": 1, "name": "ノートPC", "price": 120000},
        {"id": 2, "name": "マウス", "price": 3000}
    ]
    return {"items": items}

パスパラメータとクエリパラメータ:

from typing import Optional

# パスパラメータ:特定の商品を取得
@app.get("/items/{item_id}")
def get_item(item_id: int):
    return {"item_id": item_id, "name": "ノートPC", "price": 120000}

# クエリパラメータ:フィルタリング
@app.get("/items")
def get_items(
    skip: int = 0,
    limit: int = 10,
    category: Optional[str] = None
):
    return {
        "skip": skip,
        "limit": limit,
        "category": category
    }

アクセス例:/items?skip=0&limit=5&category=electronics

POSTリクエストでデータを受け取る

POSTリクエストは、新しいデータを作成する際に使用します。

from pydantic import BaseModel, Field

class Item(BaseModel):
    name: str = Field(..., min_length=1, max_length=100)
    price: int = Field(..., gt=0, description="価格は1円以上")
    stock: int = Field(default=0, ge=0)
    description: str = None

@app.post("/items", status_code=201)
def create_item(item: Item):
    item_dict = item.dict()
    item_dict["id"] = 1  # 仮のID
    return {
        "message": "商品を登録しました",
        "item": item_dict
    }

リクエストボディの例(JSON):

{
  "name": "ノートPC",
  "price": 120000,
  "description": "高性能ビジネスノート"
}

レスポンスとステータスコード

適切なレスポンスとステータスコードを返すことは、API設計の基本です。

主要なHTTPステータスコード:

コード 意味 使用場面
200 OK 成功(GET、PUT)
201 Created リソース作成成功(POST)
204 No Content 成功、レスポンスなし(DELETE)
400 Bad Request リクエストが不正
404 Not Found リソースが見つからない

エラーレスポンスの返し方:

from fastapi import HTTPException

@app.get("/items/{item_id}")
def get_item(item_id: int):
    item = None  # 見つからなかった場合

    if item is None:
        raise HTTPException(
            status_code=404,
            detail=f"ID {item_id} の商品が見つかりません"
        )

    return item

データバリデーションとPydanticモデル

FastAPIの強力な機能の一つが、Pydanticによる自動データバリデーションです。

Pydanticモデルの基本

Pydanticは、Pythonの型ヒントを使ってデータバリデーションを行うライブラリです。

from pydantic import BaseModel, Field, EmailStr
from typing import Optional

class Product(BaseModel):
    name: str = Field(..., min_length=1, max_length=100)
    price: int = Field(..., gt=0, le=1000000)
    stock: int = Field(default=0, ge=0)
    sku: str = Field(..., regex="^[A-Z]{3}-[0-9]{4}$")

class Contact(BaseModel):
    email: EmailStr  # メールアドレス形式を自動検証
    phone: str = Field(..., regex="^0[0-9]{9,10}$")

Pydanticの主な機能:

  1. 型変換: 文字列の"123"を自動的にint型の123に変換
  2. バリデーション: 型が合わない場合、自動的にエラーを返す
  3. デフォルト値: 指定されていないフィールドにデフォルト値を設定
  4. ドキュメント生成: 自動的にSwagger UIに反映

エラーハンドリング

バリデーションエラーが発生した場合、FastAPIは自動的に適切なエラーレスポンスを返します。

# 不正なリクエストの例
{
  "name": "",  # min_length=1に違反
  "price": -100  # gt=0に違反
}

# 自動的に返されるエラーレスポンス
{
  "detail": [
    {
      "loc": ["body", "name"],
      "msg": "ensure this value has at least 1 characters",
      "type": "value_error.any_str.min_length"
    },
    {
      "loc": ["body", "price"],
      "msg": "ensure this value is greater than 0",
      "type": "value_error.number.not_gt"
    }
  ]
}

実務で使える機能

データベース連携の基本

実際の業務システムでは、データベースとの連携が不可欠です。

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# データベース設定
SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(bind=engine)
Base = declarative_base()

# モデル定義
class Item(Base):
    __tablename__ = "items"
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    price = Column(Integer)

# テーブル作成
Base.metadata.create_all(bind=engine)

# API実装
@app.post("/items")
def create_item(item: ItemCreate):
    db = SessionLocal()
    db_item = Item(**item.dict())
    db.add(db_item)
    db.commit()
    db.refresh(db_item)
    return db_item

CORS設定とフロントエンド連携

フロントエンドアプリケーションと連携する場合、CORS設定が必要です。

from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

app.add_middleware(
    CORSMiddleware,
    allow_origins=["http://localhost:3000"],  # Reactなどの開発サーバー
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

テストの書き方

from fastapi.testclient import TestClient

client = TestClient(app)

def test_read_main():
    response = client.get("/")
    assert response.status_code == 200
    assert response.json() == {"message": "Hello World"}

def test_create_item():
    response = client.post(
        "/items",
        json={"name": "テスト商品", "price": 1000}
    )
    assert response.status_code == 201

FastAPIで業務システムを作るには

Excel管理からの脱却:在庫管理APIの例

from fastapi import FastAPI
from pydantic import BaseModel
from typing import List

app = FastAPI(title="在庫管理API")

class Stock(BaseModel):
    product_id: int
    product_name: str
    quantity: int
    location: str

# 在庫一覧取得
@app.get("/stocks", response_model=List[Stock])
def get_stocks():
    # データベースから取得
    return stocks

# 在庫追加
@app.post("/stocks")
def add_stock(stock: Stock):
    # データベースに追加
    return {"message": "在庫を追加しました"}

# 在庫更新
@app.put("/stocks/{product_id}")
def update_stock(product_id: int, quantity: int):
    # データベースを更新
    return {"message": "在庫を更新しました"}

社内ツールの内製化に向けた第一歩

FastAPIを使った社内ツール開発のステップ:

  1. 小さく始める: まず一つの機能(在庫確認など)をAPI化
  2. 段階的に拡張: 機能追加、他システムとの連携
  3. チーム内で共有: 自動ドキュメントを活用した情報共有
  4. 継続的改善: ユーザーフィードバックを元に改善

学習リソースと次のステップ

公式ドキュメント:
- FastAPI公式チュートリアル

次のステップ:
1. データベース連携(SQLAlchemy)の習得
2. 認証・セキュリティの実装
3. 非同期処理の活用
4. テスト駆動開発の導入

Harmonic Societyでは、FastAPIを活用した「ちょうどいい」業務システム開発を支援しています。小規模な社内ツールから本格的な業務システムまで、1〜3週間の短期間で構築可能です。まずはお気軽にご相談ください。

#FastAPI#使い方#入門
共有:

ちょっとした業務の悩みも、気軽にご相談ください。

まずは話だけ聞いてもらう