Python入門

FastAPI入門|PythonでREST APIをゼロから作る完全チュートリアル【初心者向け】

FastAPIとは?まずはAPIの基礎から理解しよう

FastAPI Python REST API
FastAPI Python REST API / Photo by Jan Kopřiva via Pexels

「FastAPIを使ってみたい!」と思っても、そもそもAPIって何?RESTって何?というところで止まってしまう人は多いです。この記事ではAPIの基礎の基礎から丁寧に解説しながら、PythonでREST APIを作る方法を一緒に学んでいきましょう。

そもそもAPIとは?

API(Application Programming Interface)とは、アプリケーション同士がやり取りするための「窓口」のようなものです。

たとえばレストランに例えると…

  • お客さん(クライアント)がメニューを見て注文する
  • ウェイター(API)が注文をキッチンに伝える
  • キッチン(サーバー)が料理を作って返す

このウェイターの役割がAPIです。お客さんはキッチンの中がどうなっているか知らなくていい。ウェイターに「これをください」と言うだけで、料理が出てくる仕組みです。

具体的な例としては…

  • 天気予報アプリが気象データサービスから天気情報を取得する
  • ECサイトが決済サービス(Stripe・PayPalなど)と連携して支払い処理をする
  • Googleマップを自分のサイトに埋め込む
  • TwitterやInstagramのデータを外部アプリから取得する

REST APIとは?

REST(Representational State Transfer)は、Web APIを設計するためのスタイル(考え方)の一つです。RESTに従って作られたAPIを「REST API」と呼びます。

REST APIの特徴は、HTTPのメソッドを使ってデータ操作の意味を表現する点です。

HTTPメソッド意味
GETデータを取得するユーザー情報を取得
POSTデータを新規作成する新しいユーザーを登録
PUTデータを更新するユーザー情報を更新
DELETEデータを削除するユーザーを削除

URLでリソース(操作対象)を表し、HTTPメソッドで操作の種類を表す。これがRESTの基本的な考え方です。シンプルで理解しやすいため、現代のWebサービスで広く使われています。

FastAPIとは?

FastAPIは、Pythonで高速なREST APIを簡単に作れるWebフレームワークです。2018年に登場した比較的新しいフレームワークですが、その使いやすさと高いパフォーマンスから急速に人気が高まっています。

FastAPIの主な特徴はこちらです。

  • 🚀 高速:NodeJSやGoと同等レベルのパフォーマンス
  • ✍️ 書きやすい:Pythonの型ヒントを使ってコードがシンプル
  • 📄 自動ドキュメント生成:SwaggerUIが自動で生成される
  • バリデーション自動化:入力データの検証を自動でやってくれる
  • 🔰 初心者にやさしい:少ないコードで動くAPIが作れる

APIを使うWebアプリとAPIなしのWebアプリの違い

ここで重要な疑問が出てきます。「APIを使わなくてもWebアプリは作れるのでは?」その通りです。では何が違うのでしょうか?

従来型のWebアプリ(APIなし)

DjangoやFlaskでHTMLを直接返す場合、サーバーがHTMLページをまるごと生成してブラウザに返します。ページを切り替えるたびにサーバーとの通信が発生し、画面全体が再読み込みされます。

【メリット】シンプルな構成で小規模サイトには向いている
【デメリット】フロントとバックが密結合になり、スマホアプリへの対応が難しい

REST APIを使ったWebアプリ

FastAPIのようなAPIサーバーを使う場合、サーバーはJSONデータだけを返します。フロントエンド(ReactやVueなど)がそのデータを受け取って画面を構築します。

【メリット】フロントとバックを完全に分離できる。Webアプリ・スマホアプリ・他サービスなど複数のクライアントから同じAPIを使い回せる
【デメリット】フロント・バックそれぞれの開発が必要で、小規模では構成が複雑になりやすい

比較項目APIなし(従来型)REST API(FastAPI等)
サーバーが返すものHTMLページJSONデータ
フロントとバックの関係密結合疎結合(分離)
スマホアプリ対応難しい簡単(同じAPIを使える)
向いているケース小規模・シンプルなサイト大規模・マルチプラットフォーム

FastAPIの使用例・活用シーン

「じゃあ、FastAPIって具体的にどんな場面で使うの?」というイメージを持っておくと、学習のモチベーションが上がります。代表的な活用シーンを紹介します。

  • 📱 スマホアプリのバックエンド:iOSアプリやAndroidアプリがFastAPIにリクエストを送り、データを取得・保存する
  • 🤖 AIモデルのAPI化:画像認識・テキスト分類などのAIモデルをAPIとして公開し、他のサービスから呼び出せるようにする
  • 🏢 マイクロサービス:大きなシステムを小さなAPIに分割し、それぞれを独立して開発・デプロイする
  • 🔗 外部サービスとの連携ハブ:複数の外部APIをまとめて管理・中継するゲートウェイとして使う
  • 📊 データ取得・提供API:データベースのデータを外部に提供する窓口として使う

FastAPIの環境構築

それでは実際に手を動かしていきましょう!まずはFastAPIをインストールします。

# FastAPIと、サーバー用のuvicornをインストール
pip install fastapi uvicorn

uvicornはFastAPIアプリを動かすための高速なASGIサーバーです。セットでインストールしておきましょう。

はじめてのFastAPI:Hello Worldを作ろう

まずは最もシンプルなFastAPIアプリを作ってみます。main.pyというファイルを作成して、以下のコードを書いてください。

from fastapi import FastAPI

# FastAPIのインスタンスを作成
app = FastAPI()

# GETリクエストに応答するエンドポイントを定義
@app.get("/")
def read_root():
    return {"message": "Hello, FastAPI!"}

@app.get("/hello/{name}")
def say_hello(name: str):
    return {"message": f"こんにちは、{name}さん!"}

次のコマンドでサーバーを起動します。

uvicorn main:app --reload

ブラウザで http://127.0.0.1:8000/ にアクセスすると、{"message": "Hello, FastAPI!"} が表示されます。http://127.0.0.1:8000/hello/太郎 にアクセスすると {"message": "こんにちは、太郎さん!"} が返ってきます。

また、http://127.0.0.1:8000/docs にアクセスすると、Swagger UIという自動生成ドキュメントが表示されます。これがFastAPIの大きな魅力の一つで、APIの仕様書が自動で作られるのです!

実践:TODOリストAPIを作ってみよう

Hello Worldの次は、より実用的なTODOリストAPIを作ってみましょう。GETとPOSTの両方を実装します。このような「タスク管理ツールのバックエンド」はFastAPIの代表的な使い方の一つです。

Pydanticでデータモデルを定義する

FastAPIではPydanticというライブラリを使って、受け取るデータの形を定義します。これにより、型の不一致などを自動でチェック(バリデーション)してくれます。

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List, Optional

app = FastAPI()

# TODOアイテムのデータモデルを定義
class TodoItem(BaseModel):
    title: str          # タイトル(必須)
    description: Optional[str] = None  # 説明(任意)
    done: bool = False  # 完了フラグ(デフォルトはFalse)

# データを一時的に保存するリスト(本来はDBを使います)
todos: List[dict] = []
next_id: int = 1

# TODOリストを全件取得(GET)
@app.get("/todos")
def get_todos():
    return todos

# TODOを1件取得(GET + IDパラメータ)
@app.get("/todos/{todo_id}")
def get_todo(todo_id: int):
    for todo in todos:
        if todo["id"] == todo_id:
            return todo
    # 見つからなければ404エラーを返す
    raise HTTPException(status_code=404, detail="TODOが見つかりません")

# TODOを新規追加(POST)
@app.post("/todos")
def create_todo(item: TodoItem):
    global next_id
    new_todo = {
        "id": next_id,
        "title": item.title,
        "description": item.description,
        "done": item.done
    }
    todos.append(new_todo)
    next_id += 1
    return new_todo

# TODOを削除(DELETE)
@app.delete("/todos/{todo_id}")
def delete_todo(todo_id: int):
    for i, todo in enumerate(todos):
        if todo["id"] == todo_id:
            deleted = todos.pop(i)
            return {"message": "削除しました", "todo": deleted}
    raise HTTPException(status_code=404, detail="TODOが見つかりません")

このコードでできることを整理すると…

  • GET /todos → TODOリスト全件取得
  • GET /todos/1 → ID=1のTODOを取得
  • POST /todos → 新しいTODOを追加(タイトルなどをJSONで送信)
  • DELETE /todos/1 → ID=1のTODOを削除

たったこれだけのコードで、スマホアプリのバックエンドとして使えるTODOリストAPIが完成します。もしAPIを使わない従来型の実装なら、HTMLテンプレートの用意、フォームの処理、画面遷移の設計など、もっと多くのコードが必要になります。

実践:AIモデルをAPIとして公開する例

FastAPIが特に力を発揮するのが、AIモデルのAPI化です。たとえばテキストの感情分析モデルをAPIとして公開するケースを見てみましょう。「Pythonで作ったAIを、スマホアプリや他のサービスから使えるようにしたい」という場面で非常によく使われます。

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

# 入力データのモデル
class TextInput(BaseModel):
    text: str

# 簡易的な感情分析(実際はtransformersなどのライブラリを使う)
def simple_sentiment(text: str) -> dict:
    positive_words = ["嬉しい", "楽しい", "最高", "好き", "ありがとう"]
    negative_words = ["悲しい", "つらい", "最悪", "嫌い", "困った"]
    
    score = 0
    for word in positive_words:
        if word in text:
            score += 1
    for word in negative_words:
        if word in text:
            score -= 1
    
    if score > 0:
        label = "ポジティブ"
    elif score < 0:
        label = "ネガティブ"
    else:
        label = "ニュートラル"
    
    return {"label": label, "score": score}

# 感情分析APIのエンドポイント
@app.post("/analyze")
def analyze_sentiment(input: TextInput):
    result = simple_sentiment(input.text)
    return {
        "input_text": input.text,
        "sentiment": result["label"],
        "score": result["score"]
    }

このAPIを公開すれば、iOSアプリ・Androidアプリ・他のPythonスクリプト・JavaScriptなど、どんなクライアントからでもPOSTリクエストを送るだけで感情分析が使えます。AIモデルの中身を知らなくていい。これがAPIの力です。

クエリパラメータとバリデーションの活用

実際のAPIでは「検索条件」などをURLに含めて渡す「クエリパラメータ」もよく使います。FastAPIではこれも非常に簡単に実装できます。

from fastapi import FastAPI, Query
from typing import Optional

app = FastAPI()

# ダミーの商品データ
products = [
    {"id": 1, "name": "Pythonテキスト", "price": 2800, "category": "書籍"},
    {"id": 2, "name": "Arduinoキット", "price": 3500, "category": "電子部品"},
    {"id": 3, "name": "Pythonサンプル集", "price": 1980, "category": "書籍"},
    {"id": 4, "name": "センサーセット", "price": 1200, "category": "電子部品"},
]

@app.get("/products")
def search_products(
    category: Optional[str] = None,
    min_price: Optional[int] = Query(None, ge=0),  # 0以上の整数
    max_price: Optional[int] = Query(None, ge=0)
):
    result = products
    
    # カテゴリフィルター
    if category:
        result = [p for p in result if p["category"] == category]
    
    # 価格フィルター
    if min_price is not None:
        result = [p for p in result if p["price"] >= min_price]
    if max_price is not None:
        result = [p for p in result if p["price"] <= max_price]
    
    return {"count": len(result), "products": result}

たとえば GET /products?category=書籍&max_price=2500 というリクエストを送ると、書籍カテゴリかつ2500円以下の商品だけが返ってきます。ge=0 の指定により、マイナスの値が来たら自動でエラーを返してくれます。バリデーションを手書きしなくてよいのはとても便利ですね。

まとめ:FastAPIで学んだポイントを整理

この記事では、APIの基礎からFastAPIの実装まで一気に学んできました。最後に重要なポイントをまとめておきましょう。

学んだことの要点整理

  • APIとはアプリ同士をつなぐ「窓口」。クライアントはサーバーの内部を知らなくても使える
  • REST APIとはHTTPメソッド(GET/POST/PUT/DELETE)でCRUD操作を表現するAPI設計スタイル
  • FastAPIとはPythonでREST APIを高速・簡単に作れるフレームワーク。自動ドキュメント生成付き
  • APIありとなしの違いAPIを使うとフロントとバックが分離でき、複数プラットフォームに対応しやすい
  • Pydanticでデータモデルを定義するとバリデーションが自動化される
  • 活用シーンスマホアプリのバックエンド・AI APIの公開・マイクロサービスなど

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

フレームワーク特徴向いているケース
FastAPI高速・型ヒント・自動ドキュメントREST API・AI API・マイクロサービス
Flask軽量・シンプル・柔軟小規模API・プロトタイプ
Djangoフルスタック・機能豊富大規模Webアプリ・管理画面付きサービス

次のステップ

FastAPIの基本が掴めたら、次はこんなテーマにチャレンジしてみましょう!

  • 📌 SQLAlchemyやSQLiteと組み合わせてデータベースに接続する
  • 📌 JWTを使った認証・ログイン機能を実装する
  • 📌 DockerでFastAPIアプリをコンテナ化してデプロイする
  • 📌 Render・Railway・Fly.ioなどのクラウドサービスで公開する

FastAPIは学習コストが低く、実用的なAPIが短時間で作れるため、初心者からプロまで幅広く使われています。まずは今日紹介したサンプルコードを実際に動かして、APIを作る感覚を掴んでみてください!コードを書けば書くほど理解が深まっていきますよ。

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る
Arduinoをはじめよう 第4版 (Make: PROJECTS)

もしも

Arduinoをはじめよう 第4版 (Make: PROJECTS)

Arduino公式推薦の定番入門書

Amazonで見る
徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です