Revel 框架的模板根目录严格固定为 app/views/,不可配置;Layout.html 必须置于其根目录才支持全局隐式继承;静态资源与模板路径完全分离,且不支持多模板目录搜索。

Revel 框架的模板基准目录是硬编码固定的,不能通过配置项修改——它始终从 app/views/ 开始查找所有模板,任何试图“配置基准目录”的操作都会失败。
为什么 app/views/ 是唯一有效的模板根目录
Revel 在启动时会强制扫描 app/views/ 下的子目录结构,并将其与控制器包路径严格对齐。比如控制器 app/controllers/Admin/UserController.go 必须对应 app/views/Admin/User/,而不是 views/admin/user/ 或 templates/。这个路径不是由 conf/app.conf 控制,也不响应 view.path 这类自定义配置项。
- 改名或移动
app/views/目录会导致所有视图加载失败,且日志只显示模糊的template not found,不提示实际缺失路径 - 在
app/views/外新建目录(如app/templates/)并尝试用{{template "templates/layout.html" .}}引入,Revel 会直接忽略该路径 -
revel run启动时不会校验app/views/是否存在,但首次访问页面就会静默渲染空白或跳转到默认错误页
Layout.html 必须放在 app/views/ 根目录才能被全局识别
Revel 对布局文件有特殊约定:只有放在 app/views/Layout.html(注意是根目录,不是子目录)的文件,才能被任意页面通过 {{template "Layout.html" .}} 或隐式继承机制调用。如果把它放进 app/views/layouts/Main.html,则必须显式写全路径 {{template "layouts/Main.html" .}},且无法作为默认布局被框架自动注入。
-
Layout.html文件名必须完全匹配,大小写敏感;layout.html或main.html均无效 - 若项目需要多套主布局(如后台 vs 前台),只能靠多个命名不同的布局文件(如
AdminLayout.html、PublicLayout.html),全部放在app/views/根目录下 - 使用
{{yield}}的布局中,.必须传入(即{{template "Layout.html" .}}),漏掉点号会导致子模板内.Title等字段为空
静态资源路径和模板路径是两套独立系统
别把 /assets/ 映射和模板路径混淆。虽然静态文件放在 app/public/ 并通过 /assets/xxx 访问,但这和 app/views/ 完全无关——模板引擎永远不会去 public/ 里找 .html 文件。
- 模板中引用 CSS/JS 时,路径写
/assets/css/main.css,不是/public/css/main.css,也不是/views/css/main.css - 想在模板里动态 include 一个 HTML 片段,只能放
app/views/partials/_header.html,然后用{{template "partials/_header.html" .}},不能放public/下 - Revel 不支持类似 Django 的
TEMPLATE_DIRS多目录搜索,也没有GO_TEMPLATE_PATH环境变量可覆盖
真正容易被忽略的是:当你在 IDE 里重命名 app/views/ 目录后,Revel 不会报错,revel run 仍能成功启动,但所有页面都变成空白——因为框架已彻底放弃查找模板,连日志都不输出具体原因。


















