You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go模板渲染HTML代码显示为纯文本问题求助

问题原因与解决方案

为什么HTML代码显示为纯文本?

Go的html/template包默认会对所有字符串进行HTML转义——这是为了防止XSS攻击的安全机制。你填充到SonoffBasic字段里的HTML标签(比如<div>、<span>)会被转换成HTML实体(比如&lt;div&gt;),浏览器解析时就会把这些实体当成纯文本显示,而不是渲染成HTML元素。

解决办法

要让模板直接渲染HTML内容,同时支持多个div,你需要做两处关键修改:

1. 改用template.HTML类型存储HTML内容

把结构体里的字符串字段换成template.HTML类型(这是html/template包提供的特殊类型,用来标记内容为“安全的HTML”,不会被转义),并且改成切片类型支持多个div:

import "html/template"

type WebPageHTMLItems struct {
    SonoffBasic []template.HTML // 切片类型支持多个设备div
}

2. 填充数据时转换为template.HTML

当你完成div模板的变量替换后,把字符串转换成template.HTML类型再存入结构体:

// 假设你已经完成了%connectiondotclass%等变量的替换,得到了处理好的HTML字符串
processedDiv := "<div id='sonoffbasicdevice'><span class='online'></span>...</div>"
// 添加到切片中
items.SonoffBasic = append(items.SonoffBasic, template.HTML(processedDiv))
// 如果有多个设备,重复上面的步骤添加即可

3. 修改模板循环渲染多个div

在index.html里用range循环遍历切片,渲染每个div:

<html> 
<head> 
<meta charset="utf-8"> 
<title>SmartHomePi Status</title> 
<link rel="stylesheet" href="../static/css/style.css"> 
</head> 
<body> 
<h1>HomeControl Connection Status</h1> 
<div id="wrapper" width="100%"> 
    {{range .SonoffBasic}}
        {{.}} <!-- 这里会直接渲染HTML,不会转义 -->
    {{end}}
</div> 
</body>

重要注意事项

使用template.HTML会关闭转义,所以必须确保你填充到div里的所有内容都是安全的——不要直接插入用户输入的未过滤内容,否则可能会引入XSS攻击风险。

内容的提问来源于stack exchange,提问作者Roel Balink

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:26:22