项目是什么
汉字谜盒是一款基于人工智能的字谜互动游戏:AI 随机出一道经典字谜(如"一箭穿心"),你根据谜面猜字,AI 判断对错、给提示,最后揭晓答案。
项目结构
text
汉字谜盒/
├── main.py # FastAPI 服务端(所有接口)
├── static/ # 前端静态资源(从课程资料拷贝)
│ ├── index.html # 页面结构
│ ├── app.js # 前端逻辑(调用后端接口)
│ └── style.css # 样式
└── sessions/ # 会话数据(每个会话一个 json 文件,程序自动创建)
└── 2026-04-12_16-16-13.json搭建第一步:创建项目文件夹,把课程资料里的 static 目录整个拷贝过来。
让根路径返回前端页面
python
from fastapi import FastAPI
from fastapi.responses import FileResponse
from fastapi.staticfiles import StaticFiles
app = FastAPI(title="汉字谜盒")
# 挂载静态文件目录
app.mount("/static", StaticFiles(directory="static"), name="static")
# 访问 http://localhost:8000/ 时返回前端页面
@app.get("/")
def root():
return FileResponse("static/index.html")| 参数 | 含义 |
|---|---|
"/static" | 挂载路径:任何以 /static 开头的请求都交给这里处理 |
StaticFiles(directory="static") | 真实目录:HTML、CSS、JS 等静态资源存放的地方 |
name="static" | FastAPI 内部使用的名称(可以自由定义) |
NOTE
为什么要分成两个入口?
/返回的是页面(index.html),所以用FileResponse把文件内容直接返回- 页面里的
/static/style.css、/static/app.js这些请求交给StaticFiles处理 页面里引用资源时写的是/static/xxx(绝对路径),这样静态资源就不会和接口路径打架。
前端是怎么调用后端的
前端 app.js 里通过 fetch 调用后端接口,路径都以 /api 开头:
javascript
// 获取会话列表
const response = await fetch(`${API_BASE_URL}/sessions`);
// 加载指定会话
const response = await fetch(`${API_BASE_URL}/sessions/${sessionId}`);
// 新建会话 / 删除会话 / 与 AI 交互同理| 前端请求 | 对应后端接口 |
|---|---|
GET /api/sessions | 获取会话列表 |
POST /api/sessions | 新建会话 |
GET /api/sessions/{id} | 加载指定会话 |
DELETE /api/sessions/{id} | 删除会话 |
POST /api/chat | 与 AI 交互 |
相关
练习题
一、知识回顾(读完直接做下面的实践题)
- 汉字谜盒项目里
static/存放前端静态资源(HTML/CSS/JS),sessions/存放会话数据(json 文件) - 让根路径返回前端页面用
FileResponse响应类:return FileResponse("static/index.html") - 挂载静态目录:
app.mount("/static", StaticFiles(directory="static"), name="static") "/static"是挂载路径,任何以它开头的请求都交给静态资源处理- 页面里引用资源写成
/static/style.css(以/开头),是为了避免和**接口(API)**路径冲突 - 前端通过
fetch调用接口,本项目所有接口路径都以/api开头
二、裸写题
- 提示(先自己想,实在想不出再点开)
一级 · 思路:一个入口返回页面,一个挂载点放静态资源 二级 · 方法:
FileResponse/app.mount(...)三级 · 骨架:app.mount("/____", StaticFiles(directory="____"), name="static")- 参考答案(做完再点开)
pythonfrom fastapi import FastAPI from fastapi.responses import FileResponse from fastapi.staticfiles import StaticFiles app = FastAPI(title="汉字谜盒") # 2-1 挂载静态目录 + 首页返回页面 app.mount("/static", StaticFiles(directory="static"), name="static") @app.get("/") def root(): return FileResponse("static/index.html")- 提示(先自己想,实在想不出再点开)
一级 · 思路:页面打不开通常是路径问题——先确认
static是否在项目根目录 二级 · 方法:FileResponse("static/index.html")里的路径是相对当前工作目录的 三级 · 骨架:用TestClient也能验证:client.get("/").status_code应为 200- 参考答案(做完再点开)
text# 在项目根目录下启动服务 fastapi dev main.py # 浏览器打开 http://127.0.0.1:8000/ → 正常显示 static/index.html 页面 # 浏览器打开 http://127.0.0.1:8000/docs → FastAPI 自动生成的接口文档- 提示(先自己想,实在想不出再点开)
一级 · 思路:挂载点和页面入口都要能通 二级 · 方法:
client.get("/static/style.css")三级 · 骨架:两个都应返回 200- 参考答案(做完再点开)
python# 2-3 验证(需在项目根目录下运行,且 static/ 里已有文件) from fastapi.testclient import TestClient if __name__ == "__main__": client = TestClient(app) print("首页:", client.get("/").status_code) # 200 print("样式:", client.get("/static/style.css").status_code) # 200
