はじめに
「PythonでAPIを作ってみたい」と調べていると、よく FastAPI という名前が出てきます。
でも、そもそも「APIってなに?」「サーバーとクライアントって?」「RESTって?」というところから疑問だと、解説記事を読んでも正直よくわかりません。
この記事では、Web初心者の視点 から順番に「なぜFastAPIが便利なのか」を説明していきます。
1. まず「ブラウザとサーバー」の関係を理解しよう
普段、YouTubeやGoogleを使うとき、あなたは ブラウザ(Chrome など) でURLを入力しますよね。
このとき、裏側で何が起きているかというと:
あなたのPC(クライアント) ──── リクエスト ────► YouTubeのサーバー
◄─── レスポンス ────
| 用語 | 意味 |
|---|---|
| クライアント | 情報を「要求する」側。ブラウザやアプリのこと |
| サーバー | 情報を「提供する」側。Webサービスの裏側にある |
| リクエスト | クライアントがサーバーへ送る「お願い」 |
| レスポンス | サーバーがクライアントへ返す「返答」 |
💡 たとえるなら...
レストランで「ハンバーグ定食をください」と注文する(リクエスト)と、
店員さんが料理を持ってくる(レスポンス)イメージです。
2. REST APIとは何か?
API(Application Programming Interface)は、プログラム同士が会話するための「窓口」です。
たとえば天気アプリは「今日の東京の天気を教えて」と気象データのAPIに問い合わせ、データをもらって画面に表示しています。
REST API は、その窓口のルールの一つで、以下のような特徴があります:
- URLでリソース(データ)を表現する
- HTTP メソッドで操作を表現する
GET /users → ユーザー一覧を取得
GET /users/1 → ID=1のユーザーを取得
POST /users → ユーザーを新規作成
PUT /users/1 → ID=1のユーザーを更新
DELETE /users/1 → ID=1のユーザーを削除
このような「取得・作成・更新・削除(CRUD)」の操作をHTTPで表現するのがREST APIです。
3. PythonでAPIを作るとどこが大変?
「じゃあPythonでREST APIを作ってみよう!」となったとき、FastAPIを使わないとどんなことが起きるか を考えてみましょう。
3-1. Flaskで書くとこうなる(FastAPIなし)
PythonのWebフレームワークとして Flask が有名です。
Flaskで簡単なAPIを書くとこうなります:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/users', methods=['POST'])
def create_user():
data = request.get_json()
# ① バリデーションを自分で書かないといけない
if 'name' not in data:
return jsonify({'error': 'name is required'}), 400
if not isinstance(data['name'], str):
return jsonify({'error': 'name must be a string'}), 400
if 'age' not in data:
return jsonify({'error': 'age is required'}), 400
if not isinstance(data['age'], int):
return jsonify({'error': 'age must be an integer'}), 400
# ② 処理本体
user = {'name': data['name'], 'age': data['age']}
return jsonify(user), 201
これだけのコードで、バリデーション(入力チェック)だけで10行以上 かかっています。
しかもこれには別の問題もあります。
3-2. ドキュメントが自動で生成されない
APIを作ったら、「このAPIどうやって使うの?」という説明書(ドキュメント)が必要です。
Flaskでは、ドキュメントを別で手書きしないといけません。
- エンドポイント: POST /users
- リクエストボディ: {"name": "string", "age": "integer"}
- レスポンス: 201 Created ...
これを Swagger UI や Postman で管理するのは、特に初心者には手間がかかります。
3-3. 型ヒントとの連携が難しい
Python 3.5 以降には「型ヒント」という機能があります:
def greet(name: str) -> str:
return f"Hello, {name}"
しかしFlaskはこの型ヒントを「APIのバリデーションや自動ドキュメント生成」には活用してくれません。型ヒントを書いても、それはあくまでIDEへのヒントにとどまります。
3-4. 非同期処理が難しい
最近のWebアプリでは、DBへのクエリやファイルI/Oなどを非同期(async/await) で処理することでパフォーマンスが上がります。
FlaskはデフォルトでASGIに対応していないため、非同期処理をしようとすると追加ライブラリの導入・設定が必要でした。
4. FastAPIが解決すること
上記の課題をまとめると、こうなります:
| 課題 | FastAPIなし | FastAPI |
|---|---|---|
| バリデーション | 自分で書く | 自動(Pydanticで型定義するだけ) |
| APIドキュメント | 手書き | 自動生成(Swagger UI) |
| 型ヒント活用 | IDEのヒントのみ | バリデーションに直結 |
| 非同期処理 | 追加設定が必要 | ネイティブ対応(async/await) |
FastAPIで同じAPIを書くとこうなる
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
# ① 型をクラスで定義するだけ
class UserCreate(BaseModel):
name: str
age: int
@app.post('/users', status_code=201)
def create_user(user: UserCreate):
# ② バリデーションは自動!型が合わなければエラーを返してくれる
return user
たったこれだけです!
name が文字列でなければ、FastAPIが自動で 422 Unprocessable Entity を返してくれます。
Swagger UIが自動で生成される
FastAPIを起動して http://localhost:8000/docs にアクセスすると、こんな画面が自動で表示されます:
┌────────────────────────────────────────────────┐
│ POST /users │
│ │
│ Request Body: │
│ { │
│ "name": "string", │
│ "age": 0 │
│ } │
│ │
│ [Try it out] │
└────────────────────────────────────────────────┘
ドキュメントを書く手間がゼロ になります。
5. FastAPIのクイックスタート
pip install fastapi uvicorn
# main.py
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_available: bool = True # デフォルト値も設定できる
@app.get("/")
def read_root():
return {"message": "Hello, FastAPI!"}
@app.get("/items/{item_id}")
def read_item(item_id: int):
return {"item_id": item_id}
@app.post("/items")
def create_item(item: Item):
return item
uvicorn main:app --reload
起動したら:
-
http://localhost:8000/docs→ Swagger UI(自動生成ドキュメント) -
http://localhost:8000/redoc→ ReDoc形式のドキュメント
6. まとめ
FastAPIが初心者にもおすすめな理由:
- コードが少ない ── Pydanticの型定義だけでバリデーションが完成
-
ドキュメントが自動生成 ──
/docsにアクセスするだけ - 型ヒントと完全連携 ── Pythonの標準機能をフル活用
-
非同期対応 ──
async defをそのまま書ける - 高速 ── NodeのExpressに匹敵するパフォーマンス(TechEmpower Benchmark参照)
「PythonでAPIを作ってみたい」と思ったら、まずFastAPIから始めるのが今の定番です。
参考
この記事は学習日記として書いています。間違いや補足があればコメントいただけると嬉しいです!