PythonでWebアプリケーション開発やAPI開発を行う際に注目を集めているフレームワークがFastAPIです。
高速かつ現代的な設計で、多くの開発者から支持されています。
この記事ではFastAPIの基本概念から実際の使い方、活用シーン、そしてFlaskとの違いまでをわかりやすく丁寧に解説します。
FastAPIとは?
FastAPIは、PythonでWebサービスを作るための速くて使いやすいライブラリです。
FastAPIの一番の特徴は、Pythonの書き方に沿ってデータの型を指定するだけで、自動的に以下のことをやってくれる点です:
- 送られてきたデータが正しいかチェックする
- APIの使い方を説明するページを自動で作成する
FastAPIを使えば、普通のPython関数を書くのとほぼ同じ感覚で、Webサービスが簡単に作れます。
基本的な使い方
まずは、最もシンプルなAPIエンドポイントを作成する基本的なコードを見てみましょう。
下記コードが行っていることは「2つのGETエンドポイントを作る」です。
/
にアクセスすると「Hello World」を返す/items/{item_id}
は URLの一部からitem_id
を、?q=... からクエリ文字列q
を受け取る
1 2 3 4 5 6 7 8 9 10 11 12 |
from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"message": "Hello World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: str = None): return {"item_id": item_id, "q": q} |
app = FastAPI()
で FastAPIアプリケーションのインスタンスを作成@app.get("/")
でルートパス("/")にGETエンドポイントを定義@app.get("/items/{item_id}")
でパスパラメータ(item_id
)とクエリパラメータ(q
)を含むエンドポイントを作成read_item(item_id: int, q: str = None):
部分の型ヒント(int
,str
)によって自動的に型が合っているかのチェックがされる
サーバーを起動するには uvicorn main:app --reload
コマンドを使用します。
POSTリクエストの処理
FastAPIでは、クライアントから送られてくるJSONボディを受け取り、型に沿って自動検証(バリデーション)したうえで関数に渡すことができます。
下記コードが行っていることは「POST /items/ で Item
という設計図(Pydanticモデル)どおりにJSONを受け取り、値を返す」ということです。
- 受け取りたいJSONの形(
name
,price
,is_offer
)をItem
モデルで定義 POST /items/
にJSONを送ると、FastAPIが自動でパース&検証してitem: Item
に渡す- 型が合わなければ 422(Unprocessable Entity)でどこがダメかをJSONで説明して返す
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class Item(BaseModel): name: str price: float is_offer: bool = None @app.post("/items/") def create_item(item: Item): return {"item_name": item.name, "price": item.price} |
- PItem(BaseModel) で「受け取るJSONの設計図」を宣言(各フィールドの型とデフォルト値もここで定義)
@app.post("/items/")
で POSTエンドポイントを定義create_item(item: Item):
の引数の型指定によって、リクエストボディは JSON から Item に自動変換される。- 型が合わない・必須項目が欠けている場合は 422 を自動で返却
- 正常時は Pythonの辞書を返すだけでOK(FastAPIが自動でJSON化してレスポンスにする)
この一連の処理をFastAPIが自動で行ってくれます。
動作確認は /docs
(Swagger UI)で「Try it out」を使うか、curl
などで JSON を送ると手早く検証できます。
FastAPIで使えるパラメータ指定の例
FastAPIでは、以下のような形式でパラメータを指定できます。
指定方法 | 書き方の例 |
---|---|
パスパラメータ | /users/{user_id} |
クエリパラメータ | def read_items(skip: int = 0, limit: int = 10) |
リクエストボディ | def create_item(item: Item) |
ヘッダー | from fastapi import Header |
Cookie | from fastapi import Cookie |
パラメータの型や制約は、Pythonの型ヒントとPydanticで柔軟に設定できます。
FastAPIの便利な機能
FastAPI では URL・クエリ・ボディ・ヘッダー・Cookie など、複数の入力を統一的に受け取れます。
Python の型ヒントを添えるだけで、自動バリデーションとドキュメント生成が有効になります。
よく使う指定方法を以下の表にまとめます。
1 2 3 4 5 6 7 8 9 10 |
from fastapi import FastAPI, HTTPException app = FastAPI() @app.get("/items/{item_id}") def read_item(item_id: int): if item_id < 0: raise HTTPException(status_code=400, detail="Item ID must be positive") return {"item_id": item_id} |
各パラメータは int
/str
などの型や、最小値・正規表現などの制約を Pydantic で細かく指定できます。
Query
・Path
・Body
・Header
・Cookie
を使うと、デフォルト値や説明・例も宣言的に記述できます。
ユースケースに応じて組み合わせ、読みやすさと安全性を両立させましょう。
FastAPIを使うときの注意点
型ヒントを正しく使う
FastAPIの恩恵を最大限受けるには、適切な型ヒントが重要です。
型ヒントが不正確だと、期待通りのバリデーションが動作しません。
1 2 3 4 5 6 7 8 |
# 良い例 def read_item(item_id: int, q: Optional[str] = None): return {"item_id": item_id} # 悪い例(型ヒントなし) def read_item(item_id, q=None): return {"item_id": item_id} |
Pydanticモデルの設計に注意
複雑なデータ構造を扱う場合は、Pydanticモデルを適切に設計する必要があります。
Pydantic は Pythonの型ヒント を使って、入力データの検証(バリデーション)と変換(JSON⇄Pythonオブジェクト)を自動で行うライブラリです。
ネストした構造や循環参照がある場合は特に注意が必要です。
1 2 3 4 5 6 7 |
from typing import Optional, List class User(BaseModel): name: str email: str items: Optional[List[Item]] = [] |
FastAPIとFlaskの違い
FastAPIは型ヒントを活用した自動バリデーションや非同期処理のサポートなど、現代的な開発体験を重視したAPI向けフレームワークです。
一方、Flaskはシンプルさや柔軟性を重視しており、特に小規模なWebアプリの開発に適しています。
以下に、それぞれの特徴を簡潔に比較した表を示します。
観点 | FastAPI | Flask |
---|---|---|
自動バリデーション | 型ヒントによってPydanticベースで自動 | 手動でバリデーション実装が必要 |
ドキュメント生成 | Swagger/OpenAPIが自動で生成される | 拡張ライブラリが必要(Flask-RESTXなど) |
非同期処理 | async def をネイティブサポート |
基本は同期処理(非同期は別途工夫) |
パフォーマンス | Starletteベースで高速・軽量 | 同時アクセスにやや弱い |
学習コスト | 型やPydanticの理解が必要 | 非常にシンプルで学びやすい |
拡張性 | 設計が整っており拡張しやすい | エクステンションが豊富で自由度が高い |
向いている用途 | API中心、機械学習バックエンド、高性能が必要な場面 | 管理画面、小規模Webアプリ、HTMLレンダリング |
どちらも優れた選択肢ですが、APIの品質やスケーラビリティを重視するならFastAPI、とにかく素早く動くものを作りたいならFlaskが向いています。
FastAPIの活用シーン
FastAPIは以下のような場面で特に威力を発揮します
- REST API開発: マイクロサービスアーキテクチャでのAPI構築に最適
- 機械学習API: モデルの推論結果を提供するAPIサービス
- データ処理API: 大量データの処理や変換を行うバックエンドサービス
- リアルタイム通信: WebSocketを使ったリアルタイムアプリケーション
型安全性と高パフォーマンスが求められるプロジェクトでは、FastAPIが第一選択肢となることが多いです。
まとめ
今回はPythonのWebフレームワークFastAPIについて紹介しました。
- FastAPIは型ヒントを活用した高速で現代的なWebフレームワーク
- 自動バリデーション、ドキュメント生成など多くの機能が標準搭載
- Pydanticモデルでデータ構造を定義し、型安全なAPI開発が可能
- 型ヒントの活用とPydanticモデルの適切な設計が重要
- FlaskよりもAPI開発に特化し、高パフォーマンスを実現
FastAPIをマスターすれば、効率的で保守性の高いWebAPIを開発できるようになります。
現代的なPython Web開発の主流となりつつあるFastAPIを、ぜひ積極的に活用していきましょう。