Почему я вижу ZgotmplZ в моем HTML-шаблоне Go Go?
Когда я вызываю функцию шаблона Go для вывода HTML, он отображает ZgotmplZ
.
Пример кода:
http://play.golang.org/p/tfuJa_pFkm
package main
import (
"html/template"
"os"
)
func main() {
funcMap := template.FuncMap{
"printSelected": func(s string) string {
if s == "test" {
return `selected="selected"`
}
return ""
},
"safe": func(s string) template.HTML {
return template.HTML(s)
},
}
template.Must(template.New("Template").Funcs(funcMap).Parse(`
<option {{ printSelected "test" }} {{ printSelected "test" | safe }} >test</option>
`)).Execute(os.Stdout, nil)
}
Вывод:
<option ZgotmplZ ZgotmplZ >test</option>
Ответы
Ответ 1
"ZgotmplZ" - это особое значение, указывающее, что небезопасный контент достиг
CSS или контекст URL во время выполнения. Результатом этого примера будет:
<img src="#ZgotmplZ">
Вы можете добавить безопасную и attr-функцию к шаблону funcMap:
основной пакет
import (
"html/template"
"os"
)
func main() {
funcMap := template.FuncMap{
"attr":func(s string) template.HTMLAttr{
return template.HTMLAttr(s)
},
"safe": func(s string) template.HTML {
return template.HTML(s)
},
}
template.Must(template.New("Template").Funcs(funcMap).Parse(`
<option {{ .attr |attr }} >test</option>
{{.html|safe}}
`)).Execute(os.Stdout, map[string]string{"attr":`selected="selected"`,"html":`<option selected="selected">option</option>`})
}
Результат будет выглядеть так:
<option selected="selected" >test</option>
<option selected="selected">option</option>
Возможно, вам захочется определить некоторые другие функции, которые могут преобразовать строку в template.CSS, template.JS, template.JSStr, template.URL и т.д.
Ответ 2
У меня была аналогичная проблема с <img src="{{myfunction}}">
, где myfunction возвратил закодированное изображение.
Наконец, я решил, что вместо строковой функции return template.URL(mystring)
.
Ответ 3
Вы пытаетесь вывести HTML в место, где template/html считает небезопасным (например, внутри HTML-элемента, например:
<option {{ printSelected }}>
Я не могу найти способ убедить его в безопасности (включая возврат template.HTML вместо строки); единственная альтернатива, которую я нашел, - это переписать шаблон, в этом примере вместо этого используйте bool output:
<option {{ if printSelected }}selected{{ end }}>
Ответ 4
Самый простой способ:
import "html/template"
yourhref = template.URL(yourhref)
Ответ 5
Вы должны заключить строку в HTMLAttr
, который был разработан для текста, который вставляется между угловыми скобками. Согласно документации:
https://golang.org/pkg/html/template/#HTMLAttr
HTMLAttr инкапсулирует атрибут HTML из надежного источника, например, dir="ltr"
.
Использование этого типа представляет угрозу безопасности: инкапсулированный контент должен поступать из надежного источника, так как он будет дословно включен в выходные данные шаблона.
type HTMLAttr string
Ответ 6
package main
import (
"html/template"
"os"
)
type T struct {
HTML template.HTML
ATTR template.HTMLAttr
URL template.URL
JS template.JS
CSS template.CSS
}
func main() {
data := T{
HTML: '<div>test div</div>',
ATTR: 'selected="selected"',
URL: 'https://upload.wikimedia.org/wikipedia/commons/5/53/Google_%22G%22_Logo.svg',
CSS: 'font-size: 15px',
JS: 'console.log("hello world")',
}
template.Must(template.New("Template").Parse('
{{.HTML}}
<option {{.ATTR}} style="{{.CSS}}">test</option>
<script>{{.JS}}</script>
<img src="{{.URL}}">
')).Execute(os.Stdout, data)
}
вывод
<div>test div</div>
<option selected="selected" style="font-size: 15px">test</option>
<script>console.log("hello world")</script>
<img src="https://upload.wikimedia.org/wikipedia/commons/5/53/Google_%22G%22_Logo.svg">
Детская площадка Пример