如何让Go template/text忽略特定行?需类似Jinja2 raw标签的效果
解决Go text/template误解析模板风格内容的问题
Go的text/template库本身并没有像Jinja2里{% raw %}{% endraw %}那样的原生“原始内容”标记,但你完全可以通过两种无需修改解析二进制的方法来让目标行原封不动输出,避免被误解析:
方法1:用原生字符串字面量包裹整行
Go模板支持用反引号`定义原生字符串,这种字符串内部的内容不会被模板解析器处理,直接原样输出。把你的ACCESS_LOG_TEMPLATE行整个用反引号包裹,再放到模板输出标签里就行:
GRAVATAR_SOURCE = https://{{ .Env.GRAVATARHOST }} # 正常解析的行 {{`ACCESS_LOG_TEMPLATE = {{.Ctx.RemoteAddr}} - {{.Identity}} {{.Start.Format "[02/Jan/2006:15:04:05 -0700]" }} "{{.Ctx.Req.Method}} {{.Ctx.Req.RequestURI}} {{.Ctx.Req.Proto}}" {{.ResponseWriter.Status}} {{.ResponseWriter.Size}} "{{.Ctx.Req.Referer}}\" \"{{.Ctx.Req.UserAgent}}"`}}
这样模板解析器会把反引号里的内容当作普通字符串直接输出,完全不会解析其中的{{...}}语法。
方法2:逐个转义模板标记
如果不想用整行包裹,也可以把每个{{替换成{{"{{"}},每个}}替换成{{"}}"}}。模板解析时会把这些转义后的标签解析成原始的{{和}}字符输出:
GRAVATAR_SOURCE = https://{{ .Env.GRAVATARHOST }} # 正常解析的行 ACCESS_LOG_TEMPLATE = {{"{{"}}.Ctx.RemoteAddr{{"}}"}} - {{"{{"}}.Identity{{"}}"}} {{"{{"}}.Start.Format "[02/Jan/2006:15:04:05 -0700]" {{"}}"}} "{{"{{"}}.Ctx.Req.Method{{"}}"}} {{"{{"}}.Ctx.Req.RequestURI{{"}}"}} {{"{{"}}.Ctx.Req.Proto{{"}}"}} {{"}}"}} {{"{{"}}.ResponseWriter.Status{{"}}"}} {{"{{"}}.ResponseWriter.Size{{"}}"}} "{{"{{"}}.Ctx.Req.Referer{{"}}"}}\" \"{{"{{"}}.Ctx.Req.UserAgent{{"}}"}}
这种方法更灵活,适合只需要保留部分模板语法、转义另一部分的场景,但整行修改起来会繁琐一些。
两种方法都不需要修改你的Go模板解析二进制,只需要调整模板文件的内容就能解决问题。
内容的提问来源于stack exchange,提问作者Michèle Lengronne
相关产品推荐
相关产品推荐

