
flask 要求静态资源(如 mp3、js、css)必须放在 static 目录下,并通过 url_for('static', ...) 生成正确路径;直接使用相对路径(如 'bell.mp3')会导致 404,因 flask 不会自动暴露非 static 目录下的文件。
在 Flask 中,所有前端可访问的静态文件(包括音频、脚本、样式表等)必须存放在项目根目录下的 static/ 文件夹中(注意:是小写 static,不是 Static),Flask 默认将该目录映射为 /static/ URL 前缀。你当前的目录结构中使用了 Static(首字母大写),这会导致 Flask 无法识别——Python 是大小写敏感的,Flask 只认 static。
✅ 正确目录结构应为:
main.py
templates/
home.html
static/ ← 必须是小写 "static"
scripts/ ← 推荐小写,保持一致性(原 Scripts → scripts)
script.js
bell.mp3在 home.html 中,需使用 Flask 的 url_for() 函数生成静态资源的绝对 URL(它会自动拼接 /static/ 前缀),再传递给 JavaScript:
Bell Player
对应地,static/scripts/script.js 中应使用动态获取的路径,而非硬编码相对路径:
立即学习“Java免费学习笔记(深入)”;
// static/scripts/script.js
document.getElementById('playBtn').addEventListener('click', () => {
// ✅ 正确:通过 Flask 模板注入路径(推荐方式)
const audio = new Audio("{{ url_for('static', filename='scripts/bell.mp3') }}");
audio.play().catch(e => console.error("Playback failed:", e));
});⚠️ 注意:上述 {{ ... }} 是 Jinja2 模板语法,只能在 .html 文件中直接使用。若你想在纯 .js 文件中使用,有以下两种安全方案:
方案一(推荐):从 HTML 注入路径到全局变量
然后在 script.js 中:
const audio = new Audio(window.AUDIO_PATH); audio.play();
*方案二:使用 data- 属性传递**
// script.js
const btn = document.getElementById('playBtn');
btn.addEventListener('click', () => {
const src = btn.dataset.audio;
new Audio(src).play();
});? 补充说明:
- Flask 默认只服务 static/ 和 templates/ 目录,其他路径(如根目录、Scripts/)不会被 Web 服务器响应;
- 浏览器同源策略与 Flask 路由无关,但路径错误会直接返回 404,与跨域无关;
- 首次播放需用户交互触发(如点击按钮),否则现代浏览器会静音或拒绝自动播放(autoplay policy);
- 如需兼容性更强的音频控件,也可直接使用
总结:确保目录名是 static(小写)、路径通过 url_for() 生成、JS 中避免硬编码相对路径——这是 Flask + 前端资源协作的核心约定。










