汉字谜盒-环境搭建与静态资源

汉字谜盒-环境搭建与静态资源

2026年9月20日·#编程学习/python学习笔记Python/Web开发·1094 字 5 分钟
浏览量加载中...
AI 摘要- DeepSeek

汉字谜盒项目结构、用 FileResponse 返回前端页面、用 StaticFiles 挂载静态资源目录

封面图
汉字谜盒-环境搭建与静态资源 - 封面图

项目是什么#

汉字谜盒是一款基于人工智能的字谜互动游戏:AI 随机出一道经典字谜(如”一箭穿心”),你根据谜面猜字,AI 判断对错、给提示,最后揭晓答案。

项目结构#

汉字谜盒/
├── main.py # FastAPI 服务端(所有接口)
├── static/ # 前端静态资源(从课程资料拷贝)
│ ├── index.html # 页面结构
│ ├── app.js # 前端逻辑(调用后端接口)
│ └── style.css # 样式
└── sessions/ # 会话数据(每个会话一个 json 文件,程序自动创建)
└── 2026-04-12_16-16-13.json

搭建第一步:创建项目文件夹,把课程资料里的 static 目录整个拷贝过来。

让根路径返回前端页面#

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 开头:

// 获取会话列表
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 交互

相关#

练习题#

一、知识回顾(读完直接做下面的实践题)#

  1. 汉字谜盒项目里 static/ 存放前端静态资源(HTML/CSS/JS),sessions/ 存放会话数据(json 文件)
  2. 让根路径返回前端页面用 FileResponse 响应类:return FileResponse("static/index.html")
  3. 挂载静态目录:app.mount("/static", StaticFiles(directory="static"), name="static")
  4. "/static" 是挂载路径,任何以它开头的请求都交给静态资源处理
  5. 页面里引用资源写成 /static/style.css(以 / 开头),是为了避免和**接口(API)**路径冲突
  6. 前端通过 fetch 调用接口,本项目所有接口路径都以 /api 开头

二、裸写题#

  • 2-1 搭一个能返回页面的服务 新建项目文件夹,写 main.py:挂载 static 目录,并让 / 返回 static/index.html。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:一个入口返回页面,一个挂载点放静态资源 二级 · 方法:FileResponse / app.mount(...) 三级 · 骨架:app.mount("/____", StaticFiles(directory="____"), name="static")

    参考答案(做完再点开)
    from 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")
  • 2-2 验证页面能打开 写完后启动服务(fastapi dev main.py),在浏览器打开 http://127.0.0.1:8000/ 确认页面正常显示;再打开 /docs 看看自动生成的接口文档。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:页面打不开通常是路径问题——先确认 static 是否在项目根目录 二级 · 方法:FileResponse("static/index.html") 里的路径是相对当前工作目录的 三级 · 骨架:用 TestClient 也能验证:client.get("/").status_code 应为 200

    参考答案(做完再点开)
    # 在项目根目录下启动服务
    fastapi dev main.py
    # 浏览器打开 http://127.0.0.1:8000/ → 正常显示 static/index.html 页面
    # 浏览器打开 http://127.0.0.1:8000/docs → FastAPI 自动生成的接口文档
  • 2-3 用测试客户端检查静态资源 不启动服务器,用 FastAPI 自带的测试客户端分别请求 / 和 /static/style.css,打印状态码。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:挂载点和页面入口都要能通 二级 · 方法:client.get("/static/style.css") 三级 · 骨架:两个都应返回 200

    参考答案(做完再点开)
    # 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

评论区

[ 标签 ]
# AI37# AI 编程2# AI工具1# AI绘图1# AI辅助开发2# Ajax7# Apifox1# AstrBot3# Astro2# CC Switch1# CDN2# Claude Code1# claudecode2# ClaudeCode1# Cloudflare2# CloudFlare2# CloudFlare-ImgBed3# coc4# CSS10# DeepSeek6# deepseek2# DELETE1# Docker5# EdgeOne3# Gist1# git1# GitHub1# hexo-circle-of-friends1# HTML9# HTTP10# ImageManager1# Java23# java13# JavaScript11# JavaWeb113# JDBC7# JSON2# JUnit1# LangChain25# Linux4# Logback1# Maven17# Muse Spark1# Mybatis1# MyBatis18# MySQL45# MySql1# NapCat1# Node.js1# obsidian2# Obsidian5# OpenCode4# ORM1# PathVariable1# PicGo1# PyCharm1# Python70# RequestBody1# RequestMapping1# RESTful风格1# skills1# Slf4j1# SpringBoot37# SpringMVC5# SQL2# Streamlit5# Svelte2# TailwindCSS1# Telegram3# Tlias2# Vercel1# vscode2# Vue20# Waline3# Web3# WebDAV1# Web基础6# Web开发6# WinSCP1# YAML1# 三层架构1# 中二宣言1# 书籍1# 使用文档10# 写作1# 函数2# 刷步数1# 前端52# 动态1# 动漫1# 包1# 单词2# 博客8# 博客工作流1# 博客开发2# 参数接收1# 友链1# 反思2# 后端48# 图床6# 地图1# 备份2# 大模型1# 奇思妙想1# 存储1# 学习方法6# 学校1# 宝塔面板3# 宝宝10# 实战4# 对象1# 导航栏1# 工具2# 布局2# 开发1# 开发工具1# 开发规范1# 开心1# 异常处理1# 影视2# 微信1# 性能优化2# 总结1# 想法15# 感受1# 感悟11# 指南1# 提示词工程2# 插件5# 故障排除1# 效率工具2# 教程10# 数据分析9# 数据库27# 数据结构1# 文件操作2# 斩神1# 日常95# 日志框架1# 朋友圈1# 朱元璋1# 模块1# 模板1# 正则表达式2# 测试3# 游戏2# 爬虫7# 生活迁移1# 电影2# 电脑1# 碎碎念1# 视觉识别1# 类1# 类型注解1# 网络基础2# 网络教室1# 羊毛2# 脚本2# 脚本工具1# 自动化2# 蓝奏云1# 表单1# 订阅推荐2# 记录2# 评论系统1# 词根1# 词缀1# 说说1# 足迹1# 跑步2# 路径参数1# 转载2# 运动1# 部署11# 部落冲突1# 配置1# 随机图1# 面向对象5# 音乐3# 音标1# 项目实战11# 饮食1# 驼峰命名1# 高德地图1
[ 公告 ]

如果你喜欢,那么欢迎来到我的世界!

了解更多
[ 音乐 ]
封面

音乐

暂未播放

0:000:00
暂无歌词
找不到相关结果。
[ contents ]
[ 全部文章 ]