Pythonで人気急上昇中のWEBフレームワークFastAPIを試したいと思い、チュートリアルをやってみることにしました。FastAPIはバックエンド側のフレームワークなのでチュートリアルを実行してもjson形式のデータが表示されるだけで面白味がありませんでした。
そこでFastapiのバックエンド処理の結果をstreamlitで簡単に表示させてWEB画面を作りながらFastAPIを試してみたいと思います。
FastAPIとは
FastAPIは、pythonのWebフレームワークで2018年に初版がリリースされた新しめのフレームワーク。主な特徴としては以下が挙げられる。
Streamlitとは
今回の目的はFastAPIを試すことなので、詳細は省略。興味のある方は以下の記事を参考にしていただければと思います。
FastAPIのインストール
FastAPIを使うには、以下をインストールする必要がある。
#FastAPI本体のインストール pip install fastapi #サーバーとして動作するuvicornをインストール pip install uvicorn
※uvicornは、ASGI(非同期)アプリケーションを使用するためのサーバー環境。
最小構成でFastAPIを動かす
FastAPIのチュートリアルの最初に記載されている最もシンプルな構成でFastAPIを動かしてみる。
コード
#FastAPIをインポート
from fastapi import FastAPI
#インスタンス生成
app = FastAPI()
#デコレ―ター
@app.get("/")
async def root():
return {"message": "Hello World"}
http://localhost:ポート名’にアクセスするとHello Worldを表示する簡易プログラム。
@app.get("/")
は直下の関数が下記のリクエストの処理をするときに担当することを意味しておりデコレーターと呼ぶ。ここではasync def root():が直下の関数となる。
- パス / ※ここではhttp://localhost:ポート番号を表す
- オペレーション get
uvicornを起動する
ターミナルで以下のコマンドを実行
uvicorn main:app --reload
INFO: Will watch for changes in these directories: ['xxxxxxxxxx']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [7052] using statreload
WARNING: The --reload flag should not be used in production on Windows.
INFO: Started server process [19052]
INFO: Waiting for application startup.
INFO: Application startup complete.
ブラウザでhttp://127.0.0.1:8000にアクセスすると以下のようにjson形式で返ってくればOK。
ドキュメントの自動生成機能
FastAPIは、上記のように普通にプログラムを書くだけで、APIドキュメントを自動で生成してくれる。
Swagger UI
http://127.0.0.1:8000/docsを開くと、以下のように対話型ドキュメントが表示される。
画面でExecuteボタンを押すと、実際に/ルートパスにgetメソッドを発行してくれる。
実行結果
redoc
Swagger UIではなくredocでもドキュメントを参照することができる。
現状のプログラムから都度生成して作られるドキュメントなので修正する必要がないのがいい。
フロントエンドとバックエンドのエンジニアが違う場合などは、バックエンドの簡易仕様書として
このドキュメントを渡せば、ある程度仕様が分かってもらえそう。
このSwagger UIとredocは、127.0.0.1:8000/openapi.jsonをもとに作成されている。
FastAPIの処理結果をStreamlitで表示する(フロントエンド)
上記でバックエンド部分のFastAPIの部分はできたので、処理結果をStreamlitで表示してみる。
streamlitを使うには、以下のコマンドでインストール。
pip install streamlit
FastAPIで記述したファイルとは別でfront.pyというファイルを作成し、以下のコードを書く。
import streamlit as st
import requests
st.set_page_config(layout="wide")
url = 'http://localhost:8000'
#URLをたたいて変数に保存
response = requests.get(url)
#jsonデータに変換する
jsondata = response.json()
msg = jsondata['message']
st.title(msg)
- requestsライブラリをインポートして、URL:http://localhost:8000にgetメソッドを実行
- getメソッドはブラウザからhttp://localhost:8000にアクセスしているのと同じ。
- レスポンスで返ってきたデータをresponse.json()でjson形式に変換。
- この変換したデータをstreamlitでwebに表示。(st.title(msg))
まとめ
- uvicornは、ASGI(非同期)アプリケーションを使用するためのサーバー環境
- @で始まるパスオペレーションに対応する関数との紐づけをデコレータという
- /docsで対話型ドキュメントが見れて、requestの発行もできる。
- /redocでもドキュメントが見れる。
- /docsや/redocは、/openapi.jsonを元に作成される。
コメント