PythonでREST APIを作る方法!初心者向けFastAPI入門
生徒
「最近よく聞くAPIって何ですか?Pythonで作れると聞いたのですが、プログラミング初心者でも大丈夫でしょうか。」
先生
「APIは、プログラム同士が情報をやり取りするための窓口のようなものです。PythonのFastAPIという道具を使えば、初心者の方でも驚くほど簡単に、そして素早くAPIを作ることができますよ。」
生徒
「難しそうですが、具体的にどうやって動かすのか知りたいです!」
先生
「では、基本的な仕組みから実際の作り方まで、順番に解説していきますね。」
1. APIとREST APIの基本を知ろう
プログラミングの世界でよく耳にするAPIとは、アプリケーション・プログラミング・インターフェースの略称です。これを身近な例で例えると、レストランの注文システムに似ています。客であるあなた(アプリ)が料理(データ)を注文したいとき、メニューを見て店員さん(API)に伝えます。店員さんは厨房(サーバー)に注文を伝え、出来上がった料理をあなたに届けてくれます。このように、異なるシステムの間でデータのやり取りを仲介してくれるのがAPIの役割です。
その中でも、現在もっとも普及している仕組みがREST APIです。RESTとは、ウェブの仕組みを最大限に活用するためのルールのことです。住所のようなURLを指定して、情報を取得したり、新しく登録したりします。FastAPIは、このREST APIを非常に効率よく、少ない記述で作成できるPythonのフレームワークです。フレームワークとは、開発を楽にするためのテンプレートや道具箱のようなものだと考えてください。
2. 開発環境の準備とインストール
FastAPIを使ってプログラミングを始めるには、まずPython本体がパソコンに入っている必要があります。Pythonをインストールしたら、次にFastAPIと、それを動かすためのサーバーソフトであるuvicornをインストールします。これらは、コマンドプロンプトやターミナルという、パソコンに命令を出す画面で文字を入力してインストールします。
まずは、以下のコマンドを実行して必要な道具を揃えましょう。初心者の方でも、一行ずつコピーして貼り付けるだけで準備は完了します。ライブラリをインストールすることで、世界中のエンジニアが作った便利な機能を自分のパソコンで使えるようになります。
# FastAPI本体と、Webサーバーを動かすためのuvicornをインストールします
# pip install fastapi uvicorn
これで準備は整いました。FastAPIは動作が非常に軽く、最新の技術が盛り込まれているため、今もっとも注目されているPythonのライブラリの一つです。
3. 最初のAPIプログラムを作成してみよう
それでは、実際に動くプログラムを書いてみましょう。まずはもっともシンプルな、アクセスするとメッセージを返してくれるAPIを作成します。ファイル名は「main.py」として保存してください。プログラムの内容は、FastAPIを呼び出し、特定の場所(URL)にアクセスが来たら辞書形式のデータを返すというものです。
from fastapi import FastAPI
# FastAPIのインスタンス(実体)を作ります
app = FastAPI()
# 「/」というルート(トップページ)にアクセスしたときの処理
@app.get("/")
def read_root():
return {"message": "こんにちは!初めてのAPIへようこそ"}
このコードを書いたら、保存したフォルダで「uvicorn main:app --reload」というコマンドを実行します。すると、あなたのパソコンの中でWebサーバーが起動します。ブラウザで指定されたアドレスを開くと、プログラムが返したメッセージが表示されるはずです。このように、関数を作る感覚でAPIが構築できるのがFastAPIの魅力です。
4. パスパラメータで特定のデータを取得する
次に、URLの中に特定の情報を含めて、それに応じた結果を返す仕組みを作ってみましょう。例えば、ユーザーIDを指定して、そのユーザーの名前を表示するようなケースです。これをパスパラメータと呼びます。URLの末尾に「/users/1」と入力すればIDが1の人の情報を、「/users/2」と入力すればIDが2の人の情報を取得できるようにします。
from fastapi import FastAPI
app = FastAPI()
# URLの中に {user_id} という変数を入れます
@app.get("/users/{user_id}")
def get_user(user_id: int):
# user_idにはURLに入力された数字が入ります
return {"user_id": user_id, "name": f"ユーザー {user_id} 番さん"}
実行結果は以下のようになります。ブラウザで「/users/100」にアクセスしてみてください。入力した数字が自動的にプログラムに読み取られ、画面に表示されることがわかります。このように、動的に内容が変わるページや機能を作る際に、パスパラメータは非常に重要です。
{
"user_id": 100,
"name": "ユーザー 100 番さん"
}
5. クエリパラメータで検索条件を指定する
URLの最後に「?」を付けて、検索条件などを伝える方法をクエリパラメータと呼びます。Google検索などで、検索ワードがURLに含まれているのを見たことがあるかもしれません。FastAPIでは、関数の引数を定義するだけで、簡単にこのクエリパラメータを受け取ることができます。例えば、商品のリストを表示する際に、何件目から何件表示するかを指定する場合などに使われます。
from fastapi import FastAPI
app = FastAPI()
# 複数の検索条件などを指定できるようにします
@app.get("/items/")
def read_item(skip: int = 0, limit: int = 10):
# skip(飛ばす件数)とlimit(表示件数)を受け取ります
return {"skip": skip, "limit": limit, "message": "商品リストを表示します"}
この場合、URLを「/items/?skip=20&limit=5」とすることで、プログラム側にそれぞれの数値を渡すことができます。何も指定しなかった場合は、あらかじめ設定した「0」や「10」という初期値が使われます。これにより、ユーザーの要望に合わせた細かなデータの出し分けが可能になります。
6. 型ヒントの重要性と自動ドキュメント生成
FastAPIの最大の特徴の一つは、Pythonの型ヒントを活用している点です。型ヒントとは、このデータは数字(int)なのか、文字(str)なのかをあらかじめ明示しておく書き方のことです。これを行うことで、プログラムのミスを減らせるだけでなく、FastAPIが自動的にマニュアル(ドキュメント)を作成してくれます。
サーバーを起動した状態で、URLの末尾に「/docs」と入力してアクセスしてみてください。すると、あなたが作ったAPIがどのようなものか、どのようなデータを送ればいいのかがまとめられた綺麗な画面が表示されます。これは、Swagger UIと呼ばれるツールが自動的に生成しているものです。通常、プログラミングでは設計書を作るのが大変ですが、FastAPIならコードを書くだけで同時に設計書も完成してしまいます。
7. POSTメソッドでデータを送信する
これまでは情報を取得するGETという方法を見てきましたが、新しくデータを登録する場合はPOSTという方法を使います。例えば、新しい会員登録をしたり、SNSに投稿したりする際です。このとき、送られてくるデータの形を定義するために、PydanticというライブラリのBaseModelを使います。これにより、送られてきたデータが正しい形式かどうかを自動的にチェックしてくれます。
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
# 送られてくるデータの形を定義します
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
# データを登録するためのPOSTメソッド
@app.post("/items/")
def create_item(item: Item):
# itemの中に、送られてきた名前や価格が入っています
return {"status": "登録完了", "item_name": item.name}
この機能を使うと、例えば「価格のところに文字が入力されている」といった間違いを、プログラムが動く前に自動でエラーとして弾いてくれます。初心者にとって、データの整合性を保つのは難しい作業ですが、FastAPIはこの部分を強力にサポートしてくれます。
8. エラーハンドリングとレスポンスの制御
実際の開発では、常に正しく動くとは限りません。指定されたデータが見つからない場合や、権限がない場合に適切なエラーメッセージを返す必要があります。これをエラーハンドリングと呼びます。FastAPIでは、HTTPExceptionという機能を使って、Webの世界で共通のルールに基づいたエラー番号(ステータスコード)を返します。例えば、404番は「ページが見つかりません」という意味です。
適切なエラーを返すことは、そのAPIを使う他のエンジニアやアプリにとって非常に親切な設計となります。ただ動くだけでなく、何が原因で失敗したのかを明確に伝えることが、良いプログラマーへの第一歩です。FastAPIはこのエラー処理も直感的に記述できるため、複雑なプログラムになっても見通し良く保つことができます。これにより、バグの少ない、信頼性の高いシステムを構築することが可能になります。
まとめ
今回の記事では、PythonのモダンなWebフレームワークであるFastAPIを使用したREST APIの開発方法について詳しく解説してきました。APIの基礎知識から始まり、開発環境の構築、実際のコーディング、そしてデータの受け渡しや型定義にいたるまで、一連の流れを網羅しました。FastAPIは、その名の通り高速な動作と、開発効率の高さが最大の特徴です。型ヒントを活用することで、バグを未然に防ぎつつ、Swagger UIによる自動ドキュメント生成という強力な恩恵を受けることができます。
FastAPIによるAPI開発の主要ポイント
これまでの学習内容を振り返り、特に重要な要素を整理しましょう。API開発において、以下の要素をマスターすることが、実用的なアプリケーション構築への近道となります。
- GETメソッドとPOSTメソッドの使い分け:データの取得にはGET、新規登録にはPOSTを使用するというHTTPメソッドの基本を理解すること。
- パラメータの受け取り方:URLの一部として受け取るパスパラメータ、末尾の「?」以降で指定するクエリパラメータ、そしてリクエストボディとして構造化されたデータを受け取る方法を使い分けること。
- Pydanticによるデータバリデーション:BaseModelを継承したクラスを定義することで、送られてくるデータの型や構造を厳密にチェックし、不正なデータを遮断すること。
- 自動ドキュメントの活用:サーバー起動後に「/docs」へアクセスし、作成したAPIの動作をブラウザ上で即座にテスト・確認する習慣をつけること。
それでは、最後にこれまでの知識を総動員した、より実践に近いサンプルプログラムを確認してみましょう。このコードでは、商品の情報を管理する簡単なAPIをシミュレートしています。
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List, Optional
app = FastAPI()
# 商品データの型定義
class Product(BaseModel):
id: int
name: str
price: int
description: Optional[str] = None
# 簡易的なデータベースの代わり(メモリ上のリスト)
product_db = [
{"id": 1, "name": "ノートPC", "price": 120000},
{"id": 2, "name": "ワイヤレスマウス", "price": 3500}
]
# 全商品を取得するAPI
@app.get("/products", response_model=List[Product])
def get_all_products():
return product_db
# 特定のIDで商品を検索するAPI
@app.get("/products/{product_id}")
def get_product_by_id(product_id: int):
for product in product_db:
if product["id"] == product_id:
return product
# 見つからない場合は404エラーを返す
raise HTTPException(status_code=404, detail="商品が見つかりませんでした。")
# 新しい商品を追加するAPI
@app.post("/products")
def add_product(new_product: Product):
product_db.append(new_product.dict())
return {"message": f"商品「{new_product.name}」を登録しました。", "data": new_product}
上記のコードを実行し、例えば存在しないID(例:999)で検索をかけた場合のレスポンスは以下のようになります。FastAPIは、エラー時のレスポンスもJSON形式で分かりやすく返してくれます。
{
"detail": "商品が見つかりませんでした。"
}
PythonとFastAPIを組み合わせることで、堅牢で拡張性の高いシステムを最小限のコード量で実現できます。今回学んだ基礎を土台にして、次はデータベースとの連携や、ユーザー認証機能の実装など、より高度なステップへと進んでみてください。プログラミングの楽しさは、自分の書いたコードが意図通りに動き、誰かの役に立つツールへと進化していく過程にあります。
生徒
「先生、ありがとうございました!最初はAPIって聞くだけで身構えてしまいましたが、FastAPIを使ってみたら、意外と直感的にコードが書けるので驚きました。」
先生
「それは良かったです。特にPythonの型ヒントを活用する点は、FastAPIの大きな強みですね。実際に動かしてみて、一番印象に残った機能は何ですか?」
生徒
「やっぱり自動でドキュメントが作られる『/docs』の画面です!自分で説明書を書かなくても、どのデータを送ればいいか一目でわかるのが本当に便利だと思いました。あと、間違ったデータを入れたときにすぐエラーで教えてくれるのも助かります。」
先生
「鋭いですね。その『自動化』と『堅牢さ』こそが、現代の開発現場でFastAPIが選ばれている理由です。Pydanticによるデータチェックのおかげで、想定外の入力によるシステムダウンを未然に防ぐことができるんですよ。」
生徒
「なるほど。これなら、Webアプリの裏側を作るのも楽しくなりそうです。次は、本物のデータベースと繋いで、データを保存し続けられるように改造してみたいです!」
先生
「素晴らしい意欲ですね。データベース連携にはSQLAlchemyなどのライブラリを組み合わせるのが一般的です。一歩ずつ着実にスキルを積み上げていけば、本格的なWebサービスも夢ではありませんよ。頑張りましょう!」