フロントエンドはstreamlit、バックエンドはFastAPIのフレームワークでFastAPIのチュートリアルをやってみました。あくまでFastAPIの理解が目的でStreamlitは、フロントエンド部分を簡単に表示させるために使用しています。今回はパスパラメーターについてです。
パスパラメータとは?
パスパラメータは、パス(URL)の一部分をパラメーター化して関数内部で利用することを可能にする仕組み。パスパラメータは@app.get(“/items/{item_id}”)の{}で囲まれた部分がパスパラメータとなり、デコレーター直下の関数にパラメータと指定利用することが可能。
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id):
return {"item_id": item_id}
5行目に記述されているパスパラメータ{item_id}は、6行目の関数read_item(item_id)のような形で関数の引数と指定利用することが可能。
上記、PGを書いてFastAPIを起動する。
uvicorn main:app --reload --port 8001
URL:127.0.0.1:8001/items/item1の場合は、パスパラメータの変数にitem1が代入されて以下のようなレスポンスが返ってくる。
{"item_id":"item1"}
URL:127.0.0.1:8001/items/999の場合も、現段階では型が指定されていないので文字列としてレスポンスが返ってくる。
{"item_id":"999"}
パスパラメータに型を宣言
Python標準の型アノテーションを使用して、関数内にパスパラメータの型を宣言することもできる。
この機能で関数内で型チェックのエラー処理を実装することも可能になる。この辺りのバリデーションチェック処理などは、型ヒントを使用するライブラリPydanticで内部的に実行される。
型にint型を指定
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
上記ソースの場合だと、item_idは、int型で宣言されいる。
URL:127.0.0.1:8001/items/999のようにパスパラメータにint型を指定した場合は以下のようにレスポンスが返ってくる。
{"item_id":999}
URL:127.0.0.1:8001/items/item1のようにパスパラメータにstr型を指定した場合は、エラーとなる。
{"detail":[{"loc":["path","item_id"],"msg":"value is not a valid integer","type":"type_error.integer"}]}
URL:127.0.0.1:8001/items/1.25のようにfloat型も同様にエラーとなる。
{"detail":[{"loc":["path","item_id"],"msg":"value is not a valid integer","type":"type_error.integer"}]}
型にfloat型を指定
型にfloat型を指定した場合
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id :float):
return {"item_id": item_id}
float型に指定した状態でURL:127.0.0.1:8001/items/999のようにint型を指定した場合は、int型からfloat型に自動的に変換される。
{"item_id":999.0}
URL:127.0.0.1:8001/items/item1のようにstr型を指定した場合は、float型に変換できないのでエラーとなる。
{"detail":[{"loc":["path","item_id"],"msg":"value is not a valid float","type":"type_error.float"}]}
型にstr型を指定
型にstr型を指定した場合
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id :str):
return {"item_id": item_id}
型にstr型を指定した状態でURL:127.0.0.1:8001/items/999のようにint型を指定した場合は、
int型をstr型に変換される。float型も同様。
※ダブルクォーテーションがついてstr型となっている。
{"item_id":"999"}
パスぺレーションの順序
パスオペレーションをうまく使って、ある特定のURLの場合のみに実行される関数を作ることも可能。
以下の例ではuser/adminの場合は,管理者ユーザーです。と表示させてそれ以外はユーザーIDをそのまま表示させる。
from fastapi import FastAPI
app = FastAPI()
@app.get("/user/admin")
async def read_user_admin():
return {"user_id": "管理者ユーザーです。"}
@app.get("/user/{user_id}")
async def read_user(user_id: str):
return {"user_id": user_id}
127.0.0.1:8001/user/adminにアクセスした場合、
{"user_id":"管理者ユーザーです。"}
127.0.0.1:8001/user/testuser1にアクセスした場合は、URLがadminではないのでその下の関数が実行される。
{"user_id":"testuser1"}
同じパスオペレーションの場合は、先に記述した関数が優先される。
フロントエンドをStreamlitで表示
テキストインプットでユーザーIDの入力をできるようにして、adminの場合は管理者ユーザーです。それ以外は、ユーザーIDをそのまま表示させるようなフロントエンドをStreamlitで作る。
import streamlit as st
import requests
st.set_page_config(layout="wide")
user_id = st.text_input('ユーザーIDを入力')
if user_id:
url = 'http://localhost:8001/user/'+user_id
#URLをたたいて変数に保存
response = requests.get(url)
#jsonデータに変換する
jsondata = response.json()
user = jsondata['user_id']
st.subheader(user)
Streamlitを以下のコマンドで実行
streamlit run front.py
testuser1をインプットした場合はそのまま入力した内容が表示される。
adminをinputした場合は、Fastapiで定義した”管理者ユーザーです”。が表示される。
まとめ
- URL内で{}で囲まれた部分がパスパラメータと呼ぶ
- 関数内にパスパラメータの型を宣言することもできる。
- 型を宣言することで、FastAPI側でバリデーションチェックができる。
- 同じパスオペレーションを記述した場合は、先に記述した関数が実行される。
コメント