我正在按照本教程进行学习: golang教程-
Wiki,
并且我设法使除“其他任务”部分中的最后一点之外的所有内容都起作用。我对本教程的实现:
package main
import (
"fmt"
"io/ioutil"
"net/http"
"html/template"
"regexp"
)
type Page struct {
Title string
Body []byte
}
func (p *Page) save() error {
filename := "data/" + p.Title + ".txt"
return ioutil.WriteFile(filename, p.Body, 0600)
}
func loadPage(title string) (*Page, error) {
filename := "data/" + title + ".txt"
body, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
return &Page{Title: title, Body: body}, nil
}
func renderTemplate(w http.ResponseWriter, tmpl string, p *Page) {
t, _ := template.ParseFiles("template/" + tmpl + ".html");
t.Execute(w, p)
}
func viewHandler(w http.ResponseWriter, r *http.Request) {
title := r.URL.Path[len("/view/"):]
p, err := loadPage(title)
if err != nil {
http.Redirect(w, r, "/edit/" + title, http.StatusFound);
return
}
expr := regexp.MustCompile(`\[.+\]`)
p.Body = expr.ReplaceAllFunc(p.Body, func ( match []byte) []byte {
return []byte("<a href='/view/" + string(match) + "'>" + string(match) + "</a>")
})
renderTemplate(w, "view", p);
}
func saveHandler(w http.ResponseWriter, r *http.Request) {
title := r.URL.Path[len("/save/"):]
body := r.FormValue("body")
p := &Page{Title: title, Body: []byte(body)}
p.save()
http.Redirect(w, r, "/view/" + title, http.StatusFound)
}
func editHandler(w http.ResponseWriter, r *http.Request) {
title := r.URL.Path[len("/edit/"):]
p, err := loadPage(title);
if err != nil {
p = &Page{Title: title}
}
renderTemplate(w, "edit", p);
}
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "/view/index", http.StatusFound)
})
http.HandleFunc("/view/", viewHandler)
http.HandleFunc("/edit/", editHandler)
http.HandleFunc("/save/", saveHandler)
http.ListenAndServe(":8080", nil)
fmt.Println("Running");
}
html / template引擎会按预期方式打印定位标记,但会使用html实体对其进行转义。我还没有找到合适的方法。
使用template.HTML将正文标记为安全HTML。
以下函数将正文转换为HTML。
// Move to package-level variable so that it's compile once.
var linkPat = regexp.MustCompile(`\[.+\]`)
func toHTML(s string) template.HTML {
// Escape everything in the string first to ensure that
// special characters ('<' for example) are displayed as
// characters and not treated as markup.
s = template.HTMLEscapeString(s)
// Insert the links.
s = linkPat.ReplaceAllStringFunc(s, func(m string) string {
s = s[1 : len(s)-1]
return "<a href='/view/" + m + "'>" + m + "</a>"
})
return template.HTML(s)
}
使用以下方式渲染页面:
renderTemplate(w, "edit", map[string]interface{}{
"Title": p.Body,
"Body": toHTML(p.Body),
})
问题内容: 我在golang中有一个模板,其中有一个看起来像这样的字符串: 我期望输出是这样的: 但是我看到的是这样的: 我还尝试插入一些JSON,但golang会转义字符并在不应该出现的地方添加类似内容。 如何在golang中插入HTML模板而不发生这种情况? 问题答案: 您应该将变量作为a 而不是作为a 传递: https://play.golang.org/p/QKKpQJ7gIs 如您所见
问题内容: 我刚开始使用Go,我想用它创建一个Web应用程序。我现在要尝试的是以handlebarsjs风格使用模板。我想将页眉和页脚从主页中拉出来,以便可以将它们插入每个网页中。 我当前的设置应该解析主页,页眉和页脚HTML文件并缓存它们。然后,我执行home.html模板,该模板具有用于页面Title,header.html文件和footer.html文件的字段。 每当我搜索相似的页面时,我只
问题内容: 我有这个结构: 我想以相关方式显示我的段落。 我发现的唯一解决方案是基于专用功能,例如在Go和nested中进行测试: 实际上,我有更多的类型,这使它变得更加奇怪,使带有功能的Go代码和具有这些功能的模板都变得混乱。 什么是干净的解决方案?有一些或解决方案中去的模板?还是完全不同的方式来处理这些案件? 问题答案: 模板是无逻辑的。他们不应该具有这种逻辑。您可以拥有的最大逻辑是一堆。 在
问题内容: 我有这个模板,页面顶部有一个表格,要求发送的任何一篇帖子中的threadID(它们都是相同的,都是带有特定threadID的所有帖子的一部分),这显然不是工作,我唯一的想法是 如果以上任何一个不清楚,这里是Post的结构和方法。 并将切片的起源发送到模板 问题答案: 您可以将其作为一个结构传递,如下所示: 然后像这样的东西会工作
问题内容: 如果我有这样的HTML文件,该如何在Golang中进行操作: 我想将一部分代码嵌入到其他文件的标头标签中,如下所示: 我的尝试: 问题答案: 如果使用或来解析所有模板文件,则模板可以相互引用,它们可以互相包含。 更改您的内容以包括以下内容: 然后是完整的程序(从当前目录解析文件,执行并将结果写入标准输出): 有了它可能看起来像这样: 输出(打印在控制台上):
问题内容: 我正在尝试使用play(v2.2.2)的JsValue在模板中定义json对象。问题是,转换为 结果是: 我如何在Scala html模板中获取正确的json? 问题答案: 将其定义为不会自动转义。