基礎から学ぶPython入門 90日コース | データベース・Web API - Day 68:FastAPI入門

Python 90日で身につけるPython
スポンサーリンク
スポンサーリンク

Day 68:FastAPI入門 ― 「PythonでサクッとAPIを立ててみる」

Day 68では、いよいよ FastAPI というモダンなWebフレームワークに触れていきます。

キーワードはこの4つです。

  • FastAPIとは
  • ルーティング
  • GET API
  • パラメータ

ここまで、PythonでCLIアプリを作ったり、SQLiteやORMでデータを扱ったりしてきました。 今日はその延長線上で、「ブラウザや他のサービスから呼び出せるAPI」をPythonで作る という世界に足を踏み入れます。

「APIって難しそう…」と思うかもしれませんが、 FastAPIはかなり優しいフレームワークなので、 一歩ずつ進めていけば、ちゃんと動くAPIを自分の手で立てられるようになります。

FastAPIとは ― 「速くて書きやすい、PythonのAPIフレームワーク」

FastAPIのざっくりした特徴

FastAPI は、PythonでWeb APIを作るためのフレームワークです。

特徴をざっくり挙げると、こんな感じです。

  • 速い(Fast):内部で高性能なASGIサーバーを使っている
  • 型ヒントと相性が良い:Pythonの型ヒントを活かして、入力チェックやドキュメント生成をしてくれる
  • 書きやすい:シンプルなコードでAPIを定義できる
  • 自動ドキュメント:Swagger UIなどのAPIドキュメントを自動生成してくれる

「APIを作るための、現代的で気持ちの良いフレームワーク」と思ってもらえればOKです。

まずはインストールから

FastAPIを使うには、まずインストールが必要です。

bash

pip install fastapi "uvicorn[standard]"
  • fastapi:フレームワーク本体
  • uvicorn:FastAPIを動かすためのASGIサーバー(エンジンのようなもの)

これで準備は完了です。

最初のFastAPIアプリ ― 「Hello, API」を返してみる

最小構成のFastAPIアプリ

まずは、いちばんシンプルなFastAPIアプリを書いてみましょう。

# day68_fastapi_basic.py
from fastapi import FastAPI

# FastAPIアプリケーションのインスタンスを作成します。
# これが「APIサーバー本体」のような役割を持ちます。
app = FastAPI()


@app.get("/")
def read_root():
    """
    ルートパス("/")にアクセスされたときに実行される関数です。
    GETメソッドでアクセスされたときに、この関数が呼ばれます。
    戻り値は自動的にJSONとして返されます。
    """
    return {"message": "Hello, FastAPI!"}
Python

ここでやっていることは、とてもシンプルです。

  • app = FastAPI() でアプリケーションを作る
  • @app.get("/") というデコレータで、「GET / に対する処理」を登録する
  • 関数 read_root() が、その処理の中身
  • return {"message": "Hello, FastAPI!"} が、ブラウザやクライアントに返されるJSON

サーバーを起動してみる

このファイルを保存したら、ターミナルで次のように実行します。

bash

uvicorn day68_fastapi_basic:app --reload
  • day68_fastapi_basic:Pythonファイル名(.py は書かない)
  • app:その中のFastAPIインスタンスの変数名
  • --reload:コードを変更したときに自動で再起動してくれるオプション

起動したら、ブラウザで http://127.0.0.1:8000/ にアクセスしてみてください。 {"message": "Hello, FastAPI!"} というJSONが表示されれば成功です。

ルーティングとは ― 「どのURLに、どの関数を対応させるか」

ルーティングの基本イメージ

ルーティング(Routing) とは、

「どのURL(パス)にアクセスされたときに、どの関数を実行するか」を決める仕組み

のことです。

FastAPIでは、 @app.get("/path")@app.post("/path") のようなデコレータで、 ルーティングを定義していきます。

いくつかルートを増やしてみる

# day68_fastapi_routes.py
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    """
    ルートパス "/" に対するGETリクエストを処理します。
    """
    return {"message": "Welcome to Day 68 FastAPI!"}


@app.get("/status")
def read_status():
    """
    "/status" に対するGETリクエストを処理します。
    サーバーの簡単なステータスを返します。
    """
    return {"status": "ok", "version": "1.0.0"}


@app.get("/hello")
def say_hello():
    """
    "/hello" に対するGETリクエストを処理します。
    固定メッセージを返すだけのシンプルなAPIです。
    """
    return {"message": "Hello, API user!"}
Python

この状態でサーバーを起動すると、

  • GET /
  • GET /status
  • GET /hello

という3つのルートが使えるようになります。

ルーティングは、 「URLごとに、どんな機能を提供するかを整理する作業」 だと思ってもらえるとイメージしやすいです。

GET APIの基本 ― 「情報を取得するための入り口」

GETメソッドとは

HTTPにはいくつかのメソッドがありますが、 ここではまず GET に集中します。

  • GET:情報を取得するためのリクエスト
  • ブラウザでURLを開くときも、基本的にはGETが使われています

FastAPIでは、@app.get("/path") という形で、 「GETメソッドに対応するAPI」を定義していきます。

シンプルなGET APIの例

@app.get("/api/info")
def get_info():
    """
    "/api/info" に対するGET APIです。
    固定の情報をJSONで返します。
    """
    return {
        "app": "Day 68 FastAPI Demo",
        "description": "これはFastAPI入門用のサンプルAPIです。",
    }
Python

ブラウザで http://127.0.0.1:8000/api/info にアクセスすると、 このJSONが表示されます。

パラメータ ― 「URLやクエリから値を受け取る」

FastAPIの面白さがぐっと出てくるのが、パラメータ の扱いです。

大きく分けて、

  • パスパラメータ(URLの一部として渡される値)
  • クエリパラメータ?key=value の形で渡される値)

の2種類があります。

パスパラメータ ― 「URLの一部にIDを埋め込む」

例えば、

/users/1 にアクセスしたら、ID=1のユーザー情報を返したい

というようなAPIを作りたいとします。

FastAPIでは、こう書きます。

@app.get("/users/{user_id}")
def get_user(user_id: int):
    """
    パスパラメータ user_id を受け取るGET APIです。
    URLの一部 "/users/{user_id}" に埋め込まれた値が、引数 user_id に渡されます。

    ここでは、実際のDBは使わず、ダミーデータを返します。
    """

    # ダミーのユーザーデータ(本来はDBから取得します)
    dummy_user = {
        1: {"id": 1, "name": "Taro", "email": "taro@example.com"},
        2: {"id": 2, "name": "Hanako", "email": "hanako@example.com"},
    }

    user = dummy_user.get(user_id)

    if user is None:
        # 見つからなかった場合は、簡単なメッセージを返します。
        return {"error": "User not found"}

    return user
Python

ここでのポイントは、

  • "/users/{user_id}"{user_id} が、パスパラメータ
  • 関数の引数 user_id: int に、その値が渡される
  • 型ヒント int を書いておくことで、FastAPIが自動的に型変換やバリデーションをしてくれる

というところです。

http://127.0.0.1:8000/users/1 にアクセスすると、 ID=1のユーザー情報が返ってきます。

クエリパラメータ ― 「?keyword=xxx のような形で渡される値」

次に、クエリパラメータ を見てみます。

例えば、

/search?keyword=python のようなURLで、検索キーワードを渡したい

という場面です。

FastAPIでは、こう書きます。

@app.get("/search")
def search(keyword: str | None = None):
    """
    クエリパラメータ keyword を受け取るGET APIです。
    URLの末尾に "?keyword=..." の形で渡された値が、引数 keyword に入ります。

    keyword が指定されていない場合は、簡単なメッセージを返します。
    """

    if keyword is None:
        return {"message": "検索キーワードが指定されていません。"}

    # 実際の検索処理は省略し、ダミーの結果を返します。
    return {
        "keyword": keyword,
        "results": [
            {"title": f"{keyword} 入門", "url": "https://example.com/intro"},
            {"title": f"{keyword} 応用", "url": "https://example.com/advanced"},
        ],
    }
Python

ここでのポイントは、

  • 関数の引数 keyword: str | None = None が、クエリパラメータを受け取る
  • ?keyword=python のように指定すると、その値が keyword に入る
  • 指定されていない場合は None になるので、条件分岐で扱える

というところです。

http://127.0.0.1:8000/search?keyword=python にアクセスすると、 keyword="python" に基づいたダミーの検索結果が返ってきます。

FastAPI入門ミニテンプレート ― Day 68のコードをひとまとめに

最後に、Day 68の内容をひとつのファイルにまとめた FastAPI入門テンプレート を載せておきます。

# day68_fastapi_template.py
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    """
    ルートパス "/" に対するGET APIです。
    シンプルなウェルカムメッセージを返します。
    """
    return {"message": "Welcome to Day 68 FastAPI!"}


@app.get("/status")
def read_status():
    """
    サーバーの簡単なステータスを返すGET APIです。
    """
    return {"status": "ok", "version": "1.0.0"}


@app.get("/api/info")
def get_info():
    """
    固定の情報を返すGET APIです。
    """
    return {
        "app": "Day 68 FastAPI Demo",
        "description": "FastAPI入門用のサンプルAPIです。",
    }


@app.get("/users/{user_id}")
def get_user(user_id: int):
    """
    パスパラメータ user_id を受け取るGET APIです。
    ダミーのユーザーデータを返します。
    """

    dummy_user = {
        1: {"id": 1, "name": "Taro", "email": "taro@example.com"},
        2: {"id": 2, "name": "Hanako", "email": "hanako@example.com"},
    }

    user = dummy_user.get(user_id)

    if user is None:
        return {"error": "User not found"}

    return user


@app.get("/search")
def search(keyword: str | None = None):
    """
    クエリパラメータ keyword を受け取るGET APIです。
    keyword が指定されていない場合はメッセージを返し、
    指定されている場合はダミーの検索結果を返します。
    """

    if keyword is None:
        return {"message": "検索キーワードが指定されていません。"}

    return {
        "keyword": keyword,
        "results": [
            {"title": f"{keyword} 入門", "url": "https://example.com/intro"},
            {"title": f"{keyword} 応用", "url": "https://example.com/advanced"},
        ],
    }
Python

このファイルを保存して、

uvicorn day68_fastapi_template:app --reload

と実行すれば、 Day 68で扱った「ルーティング」「GET API」「パラメータ」の基本が、 ひととおり試せるようになっています。

Day 68のまとめ ― 「Pythonコードが、そのままWebの入り口になる」感覚

今日の主役は、

  • FastAPIとは:PythonでAPIを作るためのモダンなフレームワーク
  • ルーティング:URLごとに、どの関数を実行するかを決める仕組み
  • GET API:情報を取得するための基本的なAPI
  • パラメータ:パスパラメータとクエリパラメータで、外から値を受け取る方法

でした。

これまでローカルで動くCLIアプリや、 SQLite・ORMを使ったデータ操作を学んできましたが、 FastAPIを使うことで、それらを 「外部から呼び出せるサービス」 に変えていくことができます。

Pythonのコードが、そのままWebの入り口になり、 ブラウザや他のシステムとつながっていく感覚は、 なかなかワクワクするものがあります。

タイトルとURLをコピーしました