使用Echo和html / template如何将HTML传递给模板?

时间:2018-02-09 21:36:00

标签: go go-html-template

我使用Echo构建了我的第一个小型Go网络服务,我选择了他们提供的示例,用于使用html/template HTML页面模板来简化页面管理。

在其中一个页面上,我从后端API收集数据,并希望将其显示在表格中。我正在生成HTML,然后将其传递到模板中。不幸的是,html/template将其编码为安全文本,而不是让HTML传递。

我可以在html/template文档中看到如何告诉它HTML是安全的,但我不确定如何在Echo中做同样的事情。

如何制作以便通过Render传递的HTML被接受为HTML而非编码?

go文件和模板的简化版本:

server.go

package main

import (
  "io"
  "html/template"

  "github.com/labstack/echo"
  "github.com/labstack/echo/middleware"
  "github.com/labstack/gommon/log"
)

type Template struct {
  templates *template.Template
}
func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
    return t.templates.ExecuteTemplate(w, name, data)
}

func main() {
  t := &Template{
    templates: template.Must(template.ParseGlob("views/*.html")),
  }

  e := echo.New()
  e.Logger.SetLevel(log.INFO)
  e.Use(middleware.Logger())

  e.Renderer = t

  e.GET("/", homePage)

  // HTTP server
  e.Logger.Fatal(e.Start(":1323"))
}

pages.go

package main

import (
  "github.com/labstack/echo"
)

func homePage(c echo.Context) error {
  return c.Render(http.StatusOK, "home", "<p>HTML Test</p>")
}

views/home.html

{{define "home"}}
{{template "head"}}
{{template "navbar"}}

{{.}}

{{template "foot"}}
{{end}}

1 个答案:

答案 0 :(得分:1)

这包括in the html/template package summary

  

默认情况下,此程序包假定所有管道都生成纯文本字符串。它添加了必要的转义管道阶段,以便在正确的上下文中正确安全地嵌入纯文本字符串。

     

如果数据值不是纯文本,您可以通过标记其类型来确保数据值不会过度转义。

例如:

return c.Render(http.StatusOK, "home", template.HTML("<p>HTML Test</p>"))