近年、APIの開発にはPythonが広く使われています。
その中でも、FastAPIはPythonの標準的なウェブフレームワークであるFlaskやDjangoに比べ、
より高速で効率的なAPI開発を可能にします。
この記事では、FastAPIを使ってRESTful APIを開発する方法を、サンプルコードを交えて解説します。
FastAPIの特徴
- Pythonの型ヒントを活用し、自動的にリクエストのバリデーションを行う
- 自動的にAPIドキュメントを生成(Swagger UI, ReDoc)
- 非同期処理に対応し、高いパフォーマンスを発揮
- OAuth2、JWTなどの認証方式をサポート
以上が、FastAPIの主な特徴です。
これらの特徴により、FastAPIは高速で効率的なAPI開発を可能にします。
開発環境の準備
まず、PythonとFastAPI、およびASGIサーバーであるuvicornをインストールします。
pip install fastapi uvicorn
FastAPIは、ASGIサーバーの上で動作します。
ASGIは、非同期処理に対応したPythonのウェブサーバーインターフェースです。
uvicornは、FastAPIを実行するために推奨されているASGIサーバーの一つで、高速で軽量な特徴があります。
シンプルなAPIの作成
以下は、FastAPIを使った基本的なAPIの例です。
from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: str = None): return {"item_id": item_id, "q": q}
このコードでは、以下の2つのエンドポイントを定義しています。
- ルートパス(”/”)
- アイテムIDを受け取るパス(”/items/{item_id}”)
APIサーバーの起動
APIサーバーを起動するには、以下のコマンドを実行します。
uvicorn main:app --reload
ここで、mainは、FastAPIのインスタンスが定義されているPythonファイルの名前(この例ではmain.py)です。
–reloadオプションを指定すると、コードの変更を検知して自動的にサーバーが再起動します。
これで、http://127.0.0.1:8000/ でAPIサーバーにアクセスできます。
Chromeでアクセスすると、次のように表示されます。
また、http://127.0.0.1:8000/docs にアクセスすると、自動生成されたAPIドキュメント(Swagger UI)を確認できます。
Swagger UIは、これはこれでかなり便利です。
より複雑なAPIの開発
実際のAPIでは、データベースとの連携やリクエストボディの受け取りなど、より複雑な処理が必要になります。
以下は、Pydanticを使ってリクエストボディを定義し、APIでJSONデータを受け取る例です。
from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class Item(BaseModel): name: str price: float is_offer: bool = None @app.post("/items/") def create_item(item: Item): return {"item_name": item.name, "price": item.price, "is_offer": item.is_offer}
このコードでは、/items/ エンドポイントがPOSTリクエストを受け付けるように定義しています。
create_item 関数は、Item クラスのインスタンスをリクエストボディとして受け取り、JSONデータが自動的に解析・バリデーションされます。
cURLを使ってテストする際は、以下のコマンドを用います。
curl -X 'POST' \ 'http://127.0.0.1:8000/items/' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "name": "string", "price": 0, "is_offer": true }'
実は、これはSwagger UIで確認できるコマンドになります。
なお、Windowsの場合だとPowerShellで確かめたいですよね。
その場合は、以下を実行します。
$headers = @{ 'accept' = 'application/json' 'Content-Type' = 'application/json' } $body = @{ 'name' = 'string' 'price' = 0 'is_offer' = $true } | ConvertTo-Json Invoke-RestMethod -Uri 'http://127.0.0.1:8000/items/' -Method 'POST' -Headers $headers -Body $body
実行した結果は、以下。
ちゃんとAPI側のログにもアクセスの形跡があります。
まとめ
FastAPIを使えば、Pythonでシンプルかつ高速なRESTful APIを開発できます。
uvicornは、FastAPIを実行するための高速で軽量なASGIサーバーです。
本記事で紹介した基本的な使い方をマスターすれば、より複雑なAPIの開発にも応用できるでしょう。
FastAPIの公式ドキュメントには、さらに多くの機能や使用例が紹介されているので、ぜひ参考にしてみてください。