
bottle应用中使用mako渲染html时,js文件返回404,根本原因是bottle默认不自动提供静态资源(如js、css),必须显式配置静态文件路由,否则浏览器无法加载外部脚本。
bottle应用中使用mako渲染html时,js文件返回404,根本原因是bottle默认不自动提供静态资源(如js、css),必须显式配置静态文件路由,否则浏览器无法加载外部脚本。
在你的当前代码中,@route("/main") 仅处理 HTML 页面渲染逻辑,而 <script src="javascript/script.js"></script> 这一路径是相对于当前 URL(即 /main)解析的——浏览器实际会向 /main/javascript/script.js 发起请求,这显然不是你期望的静态资源路径,也未被任何路由捕获,因此返回 404。
✅ 正确做法:为静态资源(如 html/javascript/ 下的 JS 文件)单独注册一个静态文件路由,并确保 HTML 中的 src 路径与该路由匹配。
以下是推荐实现方式(基于 Bottle 官方教程最佳实践):
from bottle import route, static_file, run
from mako.template import Template
from mako.lookup import TemplateLookup
# ✅ 配置静态文件路由:所有以 /static/ 开头的请求,映射到本地 html/ 目录
@route('/static/<filepath:path>')
def server_static(filepath):
return static_file(filepath, root='./html')
# ✅ 渲染页面的路由(保持不变,但需更新 template.mako 中的 script 引用)
@route("/main")
def main():
lookup = TemplateLookup(directories=["html"])
return Template(filename="template.mako", lookup=lookup).render()然后,在 template.mako 或 html/main.html 中,将脚本引用改为:
立即学习“Java免费学习笔记(深入)”;
<script type="text/javascript" src="/static/javascript/script.js"></script>
⚠️ 注意事项:
-
root='./html'表示/static/xxx会从项目根目录下的html/子目录中查找文件(例如/static/javascript/script.js→./html/javascript/script.js); - 路径前缀
/static/是显式约定,避免与动态路由冲突,也便于前端路径管理; - 不要将
javascript/加入TemplateLookup.directories——那是给 Mako 查找.mako模板用的,和静态资源服务无关; - 开发时建议先在浏览器直接访问
http://localhost:8080/static/javascript/script.js,确认能正常返回 JS 内容且状态码为 200; - 若部署到生产环境,应改用 Nginx/Apache 等反向代理直接托管静态文件,提升性能与安全性。
总结:Mako 负责动态内容渲染,Bottle 负责请求分发——静态资源必须由显式路由接管。缺失这一环,再正确的模板路径也无法让浏览器加载 JS。


















