Revel框架上手需先跑通真实请求闭环:执行revel new myapp -r并访问localhost:9000确认“It works!”,再验证热重载、响应头、表单绑定、session配置及模板yield机制,缺一不可。

revel 框架不是靠“学完文档”就能上手的,它依赖明确的请求-响应闭环和约定式结构。没跑通一个带表单提交、会话跳转、模板渲染的真实流程前,所有概念都是悬浮的。
先跑通 revel run 并手动触发一次完整请求链
别急着改控制器或写路由。第一步是确认开发环境能真实响应 HTTP 请求:
– 执行 revel new myapp -r 后,访问 http://localhost:9000 看到 “It works!” 是起点,不是终点
– 修改 app/controllers/app.go 中的 App.Index 方法,加一行 return nil 前插入 println("request hit")
– 刷新页面,检查终端是否打印;没输出说明热重载没生效或代码没被 reload
– 在浏览器开发者工具 Network 标签页里确认返回状态码是 200,Content-Type 是 text/html; charset=utf-8
– 这一步卡住,后面所有 session、flash、参数绑定都无从谈起
用 App.Params 和 Validation 处理表单 POST 而不是硬编码解析
新手常直接在 handler 里用 r.FormValue 取值,这绕过了 Revel 的绑定与验证机制,后续无法复用 flash 错误提示或自动回填:
– 表单提交目标设为 /login,对应路由写成 POST /login App.Login
– 控制器方法签名必须是 func (c App) Login() revel.Result,不能带 *http.Request 参数
– 在方法体内用 c.Params.Get("username") 或更推荐的结构体绑定:type LoginInput struct { Username string `required:"true"` Password string } input := LoginInput{} c.Params.Bind(&input, "login")
– 验证失败时调用 c.Validation.Keep() + c.Flash.Out["error"] = "xxx",再 return c.Render(...),模板里用 {{if .flash.error}}{{.flash.error}}{{end}}
– 忘记调用 Keep(),flash 消息会在重定向后丢失;不写 required tag,空字符串不会触发校验
别跳过 app.conf 里的 session.cookie.secure 和 mode 设置
本地开发时默认 mode=dev,但 session 行为和生产环境差异极大:
– session.cookie.secure = false 是开发必需项,否则 Chrome/Firefox 拒绝接收非 HTTPS 的 Secure Cookie
– session.cookie.httpOnly = true 应始终开启,防止 XSS 盗取 session ID
– session.store = cookie(默认)意味着 session 数据加密后存在客户端,大小受限(约 4KB),不适合存大对象;换 memcache 或 redis 需额外配置插件并启动服务
– 改了 app.conf 不重启 revel run,修改不会生效;热重载只监听 Go 文件和模板,不监听配置文件
模板里用 {{yield}} 和 {{include}} 而不是复制粘贴 HTML 结构
Revel 的 views 目录下如果每个页面都写完整 ......,等于放弃框架最核心的布局复用能力:
– 主模板(如 views/App/Index.html)应只包含业务内容,顶部留空
– 公共布局放 views/Shared/Layout.html,里面写好 ...{{yield}}
– 控制器返回 c.RenderTemplate("App/Index.html") 时,Revel 自动套用 Layout
– 子模块复用(如用户头像组件)用 {{include "Shared/Avatar.html" .}},传入当前上下文
– 忘记 {{yield}},页面只会显示 Layout 的静态部分,业务内容消失;用错路径名(比如漏掉 Shared/),报错信息是 “template not found”,但不会提示具体缺哪个文件

















