我遵循了这个教程:http://golang.org/doc/articles/wiki/final.go,并根据我的需要略微修改了一下.问题是我想在模板中支持HTML.我知道这是一个安全风险,但目前不是一个令人担忧的问题.

页面呈现的结果:

<h1>this<strong>is</strong>a test</h1>

让我解释一下代码:

type Page struct {
    Title string
    Body  []byte
}

我想要的HTML数据存储在Page.Body中.这是[]byte型,这意味着我不能(或者我可以?)运行html/template.HTML(Page.Body),因为该函数需要一个字符串.

我有这样的预渲染模板:

var (
    templates = template.Must(template.ParseFiles("tmpl/edit.html", "tmpl/view.html"))
)

实际的ExecuteTemplate个看起来是这样的:

err := templates.ExecuteTemplate(w, tmpl+".html", p)

其中w是w http.ResponseWriter,tmpl是tmpl string,p是p *Page

最后,我的'view.html'(模板)如下所示:

<h1>{{.Title}}</h1>
<p>[<a href="/edit/{{.Title}}">edit</a>]</p>
<div>{{printf "%s" .Body}}</div>

Things I have tried:

  • {{printf "%s" .Body | html}}不会做任何事
  • 我已经包括了github.com/russross/blackfriday(Markdown处理器),并运行了p.Body = blackfriday.MarkdownCommon(p.Body),它正确地将Markdown转换为HTML,但HTML仍然作为实体输出.
  • EDIT:我try 了以下几段代码(我不知道为什么格式会乱七八糟),但它仍然输出完全相同的内容.

    var s template.HTMLs = template.HTML(p.Body) p.Body = []byte(s)

我们非常感谢您的任何指导.如果我弄糊涂了,请提出来,我可以修改我的问题.

推荐答案

将您的[]bytestring转换为template.HTML类型(文档为here)

p.Body = template.HTML(s) // where s is a string or []byte

然后,在模板中,只需:

{{.Body}}

它将被打印出来而不会逃逸.

EDIT

为了能够在页面正文中包含HTML,您需要更改Page类型声明:

type Page struct {
    Title string
    Body  template.HTML
}

然后分配给它.

Go相关问答推荐

无法找到与golang、nginx和postquist进行的docker-compose./主要

有没有更简单的方法在Go中编写这个逻辑?

Makefile:现有文件上没有这样的文件或目录,不加载环境变量

如何在使用中介资源时处理函数中的`defer`

Golang测试容器,无法使网络正常工作

链自定义GRPC客户端拦截器/DialOptions

Go中的Slice[:1][0]与Slice[0]

提供的client_secret与此帐户上任何关联的SetupIntent都不匹配

显示GUI时后台处理功能

Go 是否提供了标准或事实上的方法来处理单个语句中的错误(即内联错误处理)?

Go安装成功但没有输出简单的Hello World

Github Actions Go lambda 项目不同的 sha256sums

Go 中的 YAML 自定义标签

上传图片失败,出现错误dial tcp: lookup api.cloudinary.com: no such host

Gorm 预加载给出了模糊的列错误

使用 go.work 文件在多个测试文件上运行 go test 命令

如何在 GORM 中迭代一个 int 数组

正确编码 JWT

如何使用 httputil.ReverseProxy 设置 X-Forwarded-For

Golang 查询扫描未将查询正确扫描到 struct 中