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 |
選ばれる理由:
- 開発スピードの向上: 自動バリデーションとドキュメント生成により、開発時間を30〜40%削減
- バグの早期発見: 型ヒントによってエディタ上でエラーを事前検出
- API仕様の明確化: Swagger UIで最新のAPI仕様を確認でき、チーム連携がスムーズ
- 充実したコミュニティ: GitHubで60,000以上のスターを獲得
FastAPIが向いている開発シーンと業務活用
最適な開発シーン:
- マイクロサービスの構築: 特定機能に特化した小規模APIサービス
- モバイルアプリのバックエンド: iOS/Androidアプリのデータ提供API
- SPAのバックエンド: React、Vue.jsなどと連携
- 社内業務ツールのAPI化: Excel管理からの脱却、業務システムの段階的構築
- 機械学習モデルのAPI化: PythonのMLモデルをWeb APIとして公開
中小企業の業務システムに適している理由:
- 段階的な導入が可能: まず在庫管理APIから始めて、徐々に顧客管理、請求管理と拡張
- 開発コストの削減: 従来の開発費の1/3〜1/2程度での構築が可能
- 内製化への第一歩: Pythonの基礎知識があれば、社内でのシステム内製化の足がかりに
- 既存システムとの連携: 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の主な機能:
- 型変換: 文字列の"123"を自動的にint型の123に変換
- バリデーション: 型が合わない場合、自動的にエラーを返す
- デフォルト値: 指定されていないフィールドにデフォルト値を設定
- ドキュメント生成: 自動的に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を使った社内ツール開発のステップ:
- 小さく始める: まず一つの機能(在庫確認など)をAPI化
- 段階的に拡張: 機能追加、他システムとの連携
- チーム内で共有: 自動ドキュメントを活用した情報共有
- 継続的改善: ユーザーフィードバックを元に改善
学習リソースと次のステップ
公式ドキュメント:
- FastAPI公式チュートリアル
次のステップ:
1. データベース連携(SQLAlchemy)の習得
2. 認証・セキュリティの実装
3. 非同期処理の活用
4. テスト駆動開発の導入
Harmonic Societyでは、FastAPIを活用した「ちょうどいい」業務システム開発を支援しています。小規模な社内ツールから本格的な業務システムまで、1〜3週間の短期間で構築可能です。まずはお気軽にご相談ください。