以下に、FastAPI バックエンドとStreamlit フロントエンドの全コードを、分かりやすく整理した形で示します。
1. FastAPI バックエンド(main.py)
# main.py
from fastapi import FastAPI, Depends
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from sqlalchemy import Column, Integer, String, Date, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Session
from datetime import date
# データベース設定
DATABASE_URL = "sqlite:///./licenses.db"
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(bind=engine, autocommit=False, autoflush=False)
Base = declarative_base()
# モデル定義
class LicenseEntry(Base):
__tablename__ = 'license_entries'
id = Column(Integer, primary_key=True, index=True)
software_name = Column(String, index=True)
user_name = Column(String)
entry_date = Column(Date, default=date.today)
Base.metadata.create_all(bind=engine)
# Pydantic モデル
class LicenseInput(BaseModel):
software_name: str
user_name: str
# FastAPI アプリ定義
app = FastAPI()
# CORS 設定(フロントエンドと通信可能にする)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 本番環境では制限推奨
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# DBセッション取得関数
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
# ライセンス情報の登録エンドポイント
@app.post("/register/")
def register_license(entry: LicenseInput, db: Session = Depends(get_db)):
db_entry = LicenseEntry(
software_name=entry.software_name,
user_name=entry.user_name,
entry_date=date.today()
)
db.add(db_entry)
db.commit()
db.refresh(db_entry)
return db_entry
# 本日分のライセンス情報取得エンドポイント
@app.get("/today/")
def get_today_entries(db: Session = Depends(get_db)):
today = date.today()
return db.query(LicenseEntry).filter(LicenseEntry.entry_date == today).all()
2. Streamlit フロントエンド(app.py)
# app.py
import streamlit as st
import requests
API_URL = "http://localhost:8000"
st.title("ライセンス管理アプリ")
# 入力フォーム
software = st.text_input("ソフトウェア名")
user = st.text_input("ユーザー名")
# 登録ボタン
if st.button("登録"):
data = {
"software_name": software,
"user_name": user,
}
response = requests.post(f"{API_URL}/register/", json=data)
if response.status_code == 200:
st.success("登録に成功しました")
else:
st.error(f"登録に失敗しました(ステータス: {response.status_code})")
# 当日の利用者一覧表示
if st.button("本日の利用者一覧を表示"):
response = requests.get(f"{API_URL}/today/")
if response.status_code == 200:
entries = response.json()
if not entries:
st.info("本日の利用者はまだ登録されていません。")
else:
st.subheader("本日の利用者")
for entry in entries:
st.write(f"{entry['entry_date']} - {entry['software_name']} - {entry['user_name']}")
else:
st.error("取得に失敗しました")
実行手順まとめ
- FastAPI バックエンドを起動:
uvicorn main:app --reload
- Streamlit アプリを起動:
streamlit run app.py
- ブラウザで http://localhost:8501 にアクセス
ご要望があれば、Docker 化やデプロイ、DBをPostgreSQLに変更する例も提供できます!