Fast APIの基本的な使い方を解説します。

Fast APIとは

Fast APIは、Python向けのWebアプリケーションフレームワークです。高速で、非同期処理が可能で、コードからSwagger UIが自動生成できます。

FastAPIは、リクエストとレスポンスのスキーマを定義することになります。これによって、フロントエンドエンジニアが実装の際に利用するドキュメントを簡単に自動生成でき、さらに実際にリクエストパラメータを変更してAPIの呼び出しを試すこともできます。

なお、FastAPIのディレクトリ構造は、api ディレクトリの下に schemas, routers, models, cruds の4つのディレクトリを切るのが一般的のようです。本記事では、パスオペレーション関数(記事後半で説明)を定義するrouters配下のコードのみ実装します。

環境構築

まずpipでFastAPIをインストールします。
pip install fastapi

次に、ASGIサーバーをインストールします。ASGI(Asynchronous Server Gateway Interface)サーバーとは、Pythonで書かれたWebアプリケーションやAPIを動かすためのサーバーで、非同期処理をサポートしています。
pip install "uvicorn[standard]"

公式のデモアプリを解説

公式のチュートリアルを参考に、main.pyというファイルを作成します。
from enum import Enum
from fastapi import FastAPI


class ModelName(str, Enum):
    alexnet = "alexnet"
    resnet = "resnet"
    lenet = "lenet"

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


@app.get("/")
def read_root():
    return {"Hello": "World"}

    
@app.get("/items/{item_id}")
def read_item(item_id: int):
    return {"item_id": item_id}


@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):
    if model_name is ModelName.alexnet:
        return {"model_name": model_name, "message": "Deep Learning FTW!!!"}

    if model_name.value == "lenet":
        return {"model_name": model_name, "message": "LeCNN all the images!"}

    return {"model_name": model_name, "message": "Have some residuals!"}

@で始まるこの部分を、デコレータと呼びます。@app.get(“/”)はFastAPIのデコレーターです。この関数は、URL「/」へのリクエストを受け取るたびに、FastAPIによって呼び出されます。ちなみにappはFastAPIのインストタンス自身のことです。
この関数を、パスオペレーション関数と呼びます。パスとは、URLリンク(ドメインの後ろの部分)のことす。オペレーションとは、GET(データ取得)やPOST(データ送信)やPUT(データ更新)などのHTTPメソッドを意味します。

read_root関数では、「{“Hello”: “World”}」を返却します。他にもdict、list、str、intなどを返すことができます。
read_item関数では、int型の”item_id”を受け取ります。“item_id”はURLリンクにも記載があるので、パスパラメータと認識されます。

get_model関数では、Python標準関数のPython Enumで、値を事前に定義しています。Enumクラスを作成してimportし、strとEnumを継承したサブクラスを作成します。strを継承することで、APIドキュメントは値が文字列指定であることを知り、正確にレンダリングできるようになります。
そして、固定値のクラス属性を作ると、その値が使用可能になります。本アプリでは、model_nameの値を元に条件分岐したメッセージを返却することができます。

公式のデモアプリを実行する

実際にmain.pyを動かしてみます。uvicornでmain.pyのFastAPIアプリ”app”を起動します。“–reloadオプション“は、コードを変更した場合、サーバーが再起動する設定になります。
uvicorn main:app --reload
ブラウザでローカルホストhttp://127.0.0.1:8000にアクセスすると「{“Hello”: “World”}」と表示されます。ローカルホストに、Web APIサーバが立ち上がったことが分かります。

read_item関数の動きを見るため、以下にアクセスしてみます。
http://127.0.0.1:8000/items/3

item_id”に3を入れたURLを実行すると、“item_id”に3が表示されました。

get_model関数の動きを見るため、以下にアクセスしてみます。
http://127.0.0.1:8000/models/alexnet

"message"に"Deep Learning FTW!!!"が表示されました。

また、Pythonのrequestsのライブラリからアクセスすることも可能です。
main.pyと同じ階層に、下記のpythonファイルclient.pyを作成します。
import requests

res=requests.get("http://127.0.0.1:8000/models/alexnet")

print(res.status_code)
print(res.text)
コマンドプロンプトからclient.pyを実行してリクエストを投げると、ステータスコード(正常は200)と、テキストの{"model_name":"lenet","message":"LeCNN all the images!"}が返却されます。

Swagger UIを確認する

FastAPIは、リクエストとレスポンスのスキーマ定義に合わせて「自動対話型のAPIドキュメント」を生成してくれます。ブラウザからhttp://127.0.0.1:8000/docsにアクセスすると、生成されたAPIドキュメントを確認できます。

APIドキュメントはSwagger UIという、Web APIの仕様を視覚的に確認・操作するためのツールです。UI上でAPIの動作を確認できます。

APIの動作を確認は、以下の通りです。“Read Item”のタブを開き、”Try it out”をクリックします。パラメータを設定して”Execute”ボタンを押すと、APIを実行出来ます。リクエストURLの内容と実行結果が返ってきます。

参考記事

FastAPIチュートリアル - ユーザーガイド
【入門】PythonのFastAPIの使い方についてわかりやすく解説!