使用 Echo 和 html/template 如何将 HTML 传递给模板?
With Echo and html/template how can I pass HTML to the template?
我正在使用 Echo 构建我的第一个小型 Go Web 服务,我使用了他们提供的使用 html/template
作为 HTML 页面模板的示例来简化页面管理。
在其中一个页面上,我正在从后端 API 收集数据并希望将其显示在 table 中。我正在生成 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}}
已涵盖in the html/template
package summary:
By default, this package assumes that all pipelines produce a plain text string. It adds escaping pipeline stages necessary to correctly and safely embed that plain text string in the appropriate context.
When a data value is not plain text, you can make sure it is not over-escaped by marking it with its type.
例如:
return c.Render(http.StatusOK, "home", template.HTML("<p>HTML Test</p>"))
我正在使用 Echo 构建我的第一个小型 Go Web 服务,我使用了他们提供的使用 html/template
作为 HTML 页面模板的示例来简化页面管理。
在其中一个页面上,我正在从后端 API 收集数据并希望将其显示在 table 中。我正在生成 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}}
已涵盖in the html/template
package summary:
By default, this package assumes that all pipelines produce a plain text string. It adds escaping pipeline stages necessary to correctly and safely embed that plain text string in the appropriate context.
When a data value is not plain text, you can make sure it is not over-escaped by marking it with its type.
例如:
return c.Render(http.StatusOK, "home", template.HTML("<p>HTML Test</p>"))