fix(server): 挂载 StaticFiles 统一提供 chat.css / chat_state.js / chat_ws.js

背景:上一轮把 chat.html 的内联 CSS 拆到 chat.css,并新增 <link href="/chat.css">
引用,但 app.py 只为 chat_state.js / chat_ws.js 注册了 FileResponse 端点,
/chat.css 没有对应路由,浏览器加载返回 404,整个页面无样式。

修复:
- app.py 删除 chat_state.js / chat_ws.js 显式端点
- 改用 app.mount('/static', StaticFiles(directory=static_dir))
- chat.html 三处 URL 改为 /static/chat.{css,state.js,ws.js}

优点:未来 chat.js 拆分无需再改 app.py。

验证(serve --fake @ http://127.0.0.1:8000):
- GET /static/chat.css       -> 200 text/css; charset=utf-8
- GET /static/chat_state.js  -> 200 text/javascript; charset=utf-8
- GET /static/chat_ws.js     -> 200 text/javascript; charset=utf-8
- GET /chat.css(旧路径)     -> 404(已废弃,HTML 中无引用)
This commit is contained in:
lhl
2026-08-31 03:16:07 +08:00
parent 4feaea6e1d
commit 56a2ff82a5
2 changed files with 7 additions and 16 deletions
+4 -13
View File
@@ -17,6 +17,7 @@ from typing import Any
from fastapi import FastAPI, File, Form, HTTPException, UploadFile, WebSocket, WebSocketDisconnect
from fastapi.responses import FileResponse, HTMLResponse
from fastapi.staticfiles import StaticFiles
from pydantic import BaseModel
from genesis.inference.factory import build_inference_engine
@@ -125,19 +126,9 @@ def create_app(
def index():
return chat_html
@app.get("/chat_state.js")
def chat_state_js():
p = static_dir / "chat_state.js"
if not p.exists():
raise _error(404, "NOT_FOUND", "chat_state.js 不存在")
return FileResponse(p, media_type="application/javascript")
@app.get("/chat_ws.js")
def chat_ws_js():
p = static_dir / "chat_ws.js"
if not p.exists():
raise _error(404, "NOT_FOUND", "chat_ws.js 不存在")
return FileResponse(p, media_type="application/javascript")
# 静态资源(chat.css / chat_state.js / chat_ws.js / 未来的 chat.js
# 统一通过 /static/<file> 访问,避免逐个文件注册
app.mount("/static", StaticFiles(directory=str(static_dir), html=False), name="static")
# ---------- 项目配置 ----------
+3 -3
View File
@@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Genesis — 概要设计书自动生成(对话)</title>
<link rel="stylesheet" href="/chat.css">
<link rel="stylesheet" href="/static/chat.css">
</head>
<body>
<div id="sidebar">
@@ -119,7 +119,7 @@
</div>
</div>
<script src="/chat_state.js"></script>
<script src="/chat_ws.js"></script>
<script src="/static/chat_state.js"></script>
<script src="/static/chat_ws.js"></script>
</body>
</html>