OpenCAE Hobby Lab
OpenCAE Hobby Lab

ライセンス管理システム

以下に、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("取得に失敗しました")

実行手順まとめ

  1. FastAPI バックエンドを起動:
uvicorn main:app --reload
  1. Streamlit アプリを起動:
streamlit run app.py
  1. ブラウザで http://localhost:8501 にアクセス

ご要望があれば、Docker 化やデプロイ、DBをPostgreSQLに変更する例も提供できます!

hammamania.tech