【FastAPI + Streamlit】Hello Worldを表示

スポンサーリンク

Python人気急上昇中のWEBフレームワークFastAPIを試したいと思い、チュートリアルをやってみることにしました。FastAPIはバックエンド側のフレームワークなのでチュートリアルを実行してもjson形式のデータが表示されるだけで面白味がありませんでした。

そこでFastapiのバックエンド処理の結果をstreamlitで簡単に表示させてWEB画面を作りながらFastAPIを試してみたいと思います。

FastAPIとは

FastAPIは、pythonのWebフレームワークで2018年に初版がリリースされた新しめのフレームワーク。主な特徴としては以下が挙げられる。

FastAPIの特徴
  • ASGI(Asynchronous Server Gateway Interface)仕様で非同期処理に対応
  • WebAPIに特化したフレームワーク
  • Swagger UIという機能でドキュメントを自動生成してくれる
  • PythonのWebフレームワークの中でも一番高速と言われている。(2022年4月時点)
  • 型ヒントを活用したバリデーション機能を搭載

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を元に作成される。

コメント

タイトルとURLをコピーしました