今回は
FastAPI × htmx で作るプロトタイプを爆速実装する方法
についてです。
解説動画はこちら
FastAPI × htmx
昨今のPython界隈は streamlit というライブラリのおかげで
フロントエンドもまとめて作ることができる様になりました。
そのおかげで、似たような見た目ばかりになる
という FastAPI + htmx の組み合わせの方法をお伝えします。
なので
この組み合わせが事業モックに最適です。
環境構築と基本設定
Python側のインストール
FASTAPIの実行方法
main.py のあるディレクトリで
デモプロジェクトのディレクトリ構成
こんな内容のものを作ることができます。



main.py のコード
FAST API のコードはこんな感じになっています。
index.htmlなどは
AIエージェントを使って作ってみてください
まとめ
FastAPI × htmx で作るプロトタイプを爆速実装する方法
についてです。
解説動画はこちら
FastAPI × htmx
昨今のPython界隈は streamlit というライブラリのおかげで
フロントエンドもまとめて作ることができる様になりました。
そのおかげで、似たような見た目ばかりになる
streamlit臭のするデザインのモックばかり
という哀しい現象が起きてきています。
なので、こんな状況を打破すべく
- デザイン部分は自由に作り込める
という哀しい現象が起きてきています。
なので、こんな状況を打破すべく
- デザイン部分は自由に作り込める
- フロントエンド(React/Vue)の学習コストが高すぎて、モック作りが進まない
- FastAPI(堅牢なバックエンド) + htmx(HTML だけで Ajax)というシンプル構成
という FastAPI + htmx の組み合わせの方法をお伝えします。
FastAPI とは何か
爆速で動く、現代的な『注文受け付け窓口』
Python言語で作られたWEBフレームワークです。
プログラムの実行速度が非常に速く
開発者がコードを書くスピードも速くなるように設計されており
開発者がコードを書くスピードも速くなるように設計されており
仕様書(APIドキュメント)を自動で作成
型(データ)のチェックなども行ってくれます。
ので初学者でも取り組みが楽です。htmx とは何か
HTMLを『魔法の言葉』に変える道具
通常、Webページの一部を書き換えるには
JavaScriptをたくさん書く必要があります。
JavaScriptをたくさん書く必要があります。
htmxだと「HTMLを数文字書き足すだけ」で実現でき
JavaScriptの部分をHTMLの属性だけで指示できるます。
学習コストが劇的に低い(HTMLが分かるなら)
なので
この組み合わせが事業モックに最適です。
フロントとバックエンド、2つの学習コストが低い
シンプルでサクサク動くし、修正が簡単
モックとして作った後も
そのまま本番サービス転用も可能です。
そのまま本番サービス転用も可能です。
環境構築と基本設定
Python側のインストール
pip install fastapi uvicorn jinja2 python-multipart
FASTAPIの実行方法
main.py のあるディレクトリで
uvicorn main:app --reload
WEBブラウザー側で http://127.0.0.1:8000/
にアクセスするとFASTAPIの画面が見れます。
デモプロジェクトの概要にアクセスするとFASTAPIの画面が見れます。
デモプロジェクトのディレクトリ構成
├── main.py
└── templates/
├── index.html (ベースレイアウト)
├── customer_list.html (顧客一覧)
├── customer_detail.html (顧客詳細)
├── stock_list.html (在庫一覧)
├── stock_detail.html (在庫詳細)
└── chat.html (AIチャット)
こんな内容のものを作ることができます。



main.py のコード
FAST API のコードはこんな感じになっています。
from fastapi import FastAPI, Request, Form
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from fastapi.staticfiles import StaticFiles
from datetime import datetime
app = FastAPI()
templates = Jinja2Templates(directory="templates")
# --- ダミーデータ ---
CUSTOMERS = {
"C001": {"id": "C001", "name": "山田 太郎", "birth": "1985/05/20", "gender": "男性", "address": "東京都渋谷区...", "rank": "S", "items": [{"name": "ルンバ", "qty": 1, "price": 50000}]},
"C002": {"id": "C002", "name": "佐藤 花子", "birth": "1992/11/02", "gender": "女性", "address": "大阪府大阪市...", "rank": "A", "items": [{"name": "化粧水", "qty": 2, "price": 4000}]},
# ...他3件(実装上は同様に定義)
}
STOCKS = {
"S001": {"id": "S001", "name": "ロキソニンS", "category": "解熱鎮痛剤", "count": 150, "desc": "第1類医薬品。速効性に優れています。"},
"S002": {"id": "S002", "name": "アレグラFX", "category": "鼻炎薬", "count": 45, "desc": "眠くなりにくいアレルギー専用鼻炎薬。"},
}
def calc_age(birth_str):
birth_date = datetime.strptime(birth_str, "%Y/%m/%d")
today = datetime.today()
return today.year - birth_date.year - ((today.month, today.day) < (birth_date.month, birth_date.day))
# --- Routes ---
@app.get("/", response_class=HTMLResponse)
async def index(request: Request):
return templates.TemplateResponse("index.html", {"request": request})
# 1. 顧客管理
@app.get("/customers", response_class=HTMLResponse)
async def list_customers(request: Request):
data = []
for c in CUSTOMERS.values():
data.append({**c, "age": calc_age(c['birth']), "birth_month": c['birth'][:7]})
return templates.TemplateResponse("customer_list.html", {"request": request, "customers": data})
@app.get("/customers/{cid}", response_class=HTMLResponse)
async def detail_customer(request: Request, cid: str):
c = CUSTOMERS.get(cid)
return templates.TemplateResponse("customer_detail.html", {"request": request, "customer": c, "age": calc_age(c['birth'])})
# 2. 在庫チェック
@app.get("/stocks", response_class=HTMLResponse)
async def list_stocks(request: Request):
return templates.TemplateResponse("stock_list.html", {"request": request, "stocks": STOCKS.values()})
@app.get("/stocks/{sid}", response_class=HTMLResponse)
async def detail_stock(request: Request, sid: str):
return templates.TemplateResponse("stock_detail.html", {"request": request, "stock": STOCKS.get(sid)})
# 3. AIチャット
@app.get("/chat", response_class=HTMLResponse)
async def chat_page(request: Request):
return templates.TemplateResponse("chat.html", {"request": request})
@app.post("/chat/send", response_class=HTMLResponse)
async def chat_send(request: Request, message: str = Form(...)):
# 簡易的なAIレスポンスのシミュレーション
ai_response = f"「{message}」について承知いたしました。AIとしての回答をここに表示します。"
return f"""ここは省略しています"""
index.htmlなどは
AIエージェントを使って作ってみてください
まとめ
FAST API + htmx を用いると爆速でモック開発ができる
こちらは必要最低限の知識を学ぶだけで済む
デザイン部分は自由に作り込めるので好きなCSSを勉強しよう
足りない部分はAIエージェント使ってください
こちらは作りたいものを指示するだけ
本番作りもAIエージェントで爆速開発できます
PS
最近はこれでプロトタイプ開発していたりします。
AIエージェントも使いこなせると
爆速で開発できる様にできますよ
それでは。
PS
最近はこれでプロトタイプ開発していたりします。
AIエージェントも使いこなせると
爆速で開発できる様にできますよ
それでは。

コメントする