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 /statusGET /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の入り口になり、 ブラウザや他のシステムとつながっていく感覚は、 なかなかワクワクするものがあります。
