Golang如何正确存储和从数据库读取HTML内容
Golang如何正确存储和从数据库读取HTML内容 我正在尝试将来自summernote的HTML保存到PostgreSQL数据库中,然后将其取出并在产品页面中显示。
以下是保存产品的代码:
func addProductToDB(product productsDB) {
sqlStatement := `
UPDATE product_information
SET title = $2,description = $3,current_price = $4,old_price = $5, category_id=$6
WHERE id = $1`
_, err := db.Exec(sqlStatement, product.Id, product.Title, product.Description, product.Current_Price, product.Current_Price, product.Category)
if err != nil {
panic(err)
}
}
以下是我如何显示它:
func showProductHandler(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
id, err := strconv.ParseInt(r.FormValue("id"), 10, 32)
checkErr(err)
product := getSingleProductFromDB(id)
html := string(productTemplate)
ctx := plush.NewContext()
ctx.Set("product", product)
ctx.Set("productId", id)
s, _ := plush.Render(html, ctx)
fmt.Fprint(w, s)
}
问题是HTML显示为经过清理的状态(如果这是正确的说法)。基本上它显示为纯文本。我认为这是作为安全措施而实施的。我应该如何使其按照原始格式显示文本。
此致
更多关于Golang如何正确存储和从数据库读取HTML内容的实战教程也可以访问 https://www.itying.com/category-94-b0.html
尝试在 ResponseWriter 的 Headers 中设置内容类型为 “text/html” 之类的值。
更多关于Golang如何正确存储和从数据库读取HTML内容的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go中正确存储和显示HTML内容需要确保HTML不被转义。当使用模板引擎时,默认行为通常会对HTML进行转义以防止XSS攻击。以下是解决方案:
首先,确保数据库字段类型能够存储HTML内容。PostgreSQL的text或varchar类型都可以存储HTML。
在显示时,需要使用模板的HTML类型来防止转义。以下是修改后的代码示例:
func showProductHandler(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
id, err := strconv.ParseInt(r.FormValue("id"), 10, 32)
if err != nil {
http.Error(w, "Invalid product ID", http.StatusBadRequest)
return
}
product := getSingleProductFromDB(id)
// 创建自定义模板函数来输出原始HTML
funcMap := template.FuncMap{
"safeHTML": func(s string) template.HTML {
return template.HTML(s)
},
}
// 解析模板并使用函数映射
tmpl, err := template.New("product").Funcs(funcMap).Parse(productTemplate)
if err != nil {
http.Error(w, "Template error", http.StatusInternalServerError)
return
}
// 在模板中使用safeHTML函数
err = tmpl.Execute(w, map[string]interface{}{
"product": product,
"productId": id,
})
if err != nil {
http.Error(w, "Template execution error", http.StatusInternalServerError)
}
}
在模板中,使用safeHTML函数来显示未转义的HTML:
<div class="product-description">
{{safeHTML .product.Description}}
</div>
如果你使用的是plush模板引擎,解决方案类似。Plush支持原始HTML输出:
func showProductHandler(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
id, err := strconv.ParseInt(r.FormValue("id"), 10, 32)
checkErr(err)
product := getSingleProductFromDB(id)
html := string(productTemplate)
ctx := plush.NewContext()
ctx.Set("product", product)
ctx.Set("productId", id)
// 在plush模板中使用raw过滤器
s, err := plush.Render(html, ctx)
if err != nil {
http.Error(w, "Template rendering error", http.StatusInternalServerError)
return
}
fmt.Fprint(w, s)
}
在Plush模板中:
<div class="product-description">
<%= raw(product.Description) %>
</div>
存储HTML到数据库的代码不需要修改,因为HTML内容已经作为字符串正确存储。关键是在显示时使用适当的方法防止HTML转义。
注意:直接输出原始HTML存在安全风险,请确保HTML内容来自可信来源,或者在使用前进行适当的清理和验证。

