template

template 中间件为 Flame 实例提供基于 Go 模板引擎template - 图1在新窗口打开的 HTML 渲染服务。

你可以在 GitHubtemplate - 图2在新窗口打开 上阅读该中间件的源码或通过 pkg.go.devtemplate - 图3在新窗口打开 查看 API 文档。

下载安装

Go 语言的最低版本要求为 1.16

  1. go get github.com/flamego/template

用法示例

提示

本小结仅展示 template 中间件的相关用法,如需了解模板引擎的用法请移步 html/templatetemplate - 图4在新窗口打开 的文档。

template.Templatertemplate - 图5在新窗口打开 可以配合 template.Optionstemplate - 图6在新窗口打开 对中间件进行配置。

默认情况下,模板文件都需要被存放在 “templates” 目录内,并以 .html.tmpl 作为文件名后缀。template.Datatemplate - 图7在新窗口打开 是用于渲染模板的数据容器,即根对象。

使用本地文件

  • main.go
  • templates/home.tmpl
  1. package main
  2. import (
  3. "net/http"
  4. "github.com/flamego/flamego"
  5. "github.com/flamego/template"
  6. )
  7. func main() {
  8. f := flamego.Classic()
  9. f.Use(template.Templater())
  10. type Book struct {
  11. Name string
  12. Author string
  13. }
  14. f.Get("/", func(t template.Template, data template.Data) {
  15. data["Name"] = "Joe"
  16. data["Books"] = []*Book{
  17. {
  18. Name: "Designing Data-Intensive Applications",
  19. Author: "Martin Kleppmann",
  20. },
  21. {
  22. Name: "Shape Up",
  23. Author: "Basecamp",
  24. },
  25. }
  26. t.HTML(http.StatusOK, "home")
  27. })
  28. f.Run()
  29. }
  1. <p>
  2. Hello, <b>{{.Name}}</b>!
  3. </p>
  4. <p>
  5. Books to read:
  6. <ul>
  7. {{range .Books}}
  8. <li><i>{{.Name}}</i> by {{.Author}}</li>
  9. {{end}}
  10. </ul>
  11. </p>

使用 embed.FS

template.EmbedFStemplate - 图8在新窗口打开 是用于将 embed.FS 转换为 template.FileSystemtemplate - 图9在新窗口打开 的辅助函数。

  • 目录
  • main.go
  • embed.go
  • home.tmpl
  1. $ tree .
  2. .
  3. ├── templates
  4. ├── embed.go
  5. ├── home.tmpl
  6. ├── go.mod
  7. ├── go.sum
  8. └── main.go
  1. package main
  2. import (
  3. "net/http"
  4. "github.com/flamego/flamego"
  5. "github.com/flamego/template"
  6. "main/templates"
  7. )
  8. func main() {
  9. f := flamego.Classic()
  10. fs, err := template.EmbedFS(templates.Templates, ".", []string{".tmpl"})
  11. if err != nil {
  12. panic(err)
  13. }
  14. f.Use(template.Templater(
  15. template.Options{
  16. FileSystem: fs,
  17. },
  18. ))
  19. type Book struct {
  20. Name string
  21. Author string
  22. }
  23. f.Get("/", func(t template.Template, data template.Data) {
  24. data["Name"] = "Joe"
  25. data["Books"] = []*Book{
  26. {
  27. Name: "Designing Data-Intensive Applications",
  28. Author: "Martin Kleppmann",
  29. },
  30. {
  31. Name: "Shape Up",
  32. Author: "Basecamp",
  33. },
  34. }
  35. t.HTML(http.StatusOK, "home")
  36. })
  37. f.Run()
  38. }
  1. package templates
  2. import "embed"
  3. // 如果需要包含子目录中的模板文件则可以追加规则 "**/*"
  4. //go:embed *.tmpl
  5. var Templates embed.FS
  1. <p>
  2. Hello, <b>{{.Name}}</b>!
  3. </p>
  4. <p>
  5. Books to read:
  6. <ul>
  7. {{range .Books}}
  8. <li><i>{{.Name}}</i> by {{.Author}}</li>
  9. {{end}}
  10. </ul>
  11. </p>

模板缓存

当你的应用运行环境为 flamego.EnvTypeDev(默认运行环境)或 flamego.EnvTypeTest 时,每次响应客户端的请求都会对模板文件进行重新构建,便于开发调试。

通过 Env 函数将运行环境设置为 flamego.EnvTypeProd 可以启用模板缓存功能。