template not golang equal conditions go go-templates

not - ¿Por qué veo ZgotmplZ en la salida de mi plantilla Go HTML?



golang template range (5)

Cuando estoy llamando a una función de plantilla Ir para generar HTML, muestra ZgotmplZ .

Código de muestra:

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) }

Salida:

<option ZgotmplZ ZgotmplZ >test</option>


"ZgotmplZ" es un valor especial que indica que el contenido inseguro alcanzó un contexto de CSS o URL en tiempo de ejecución. La salida del ejemplo será:

<img src="#ZgotmplZ">

Puede agregar una función segura y attr a la plantilla funcMap:

paquete principal

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>`}) }

La salida se verá como:

<option selected="selected" >test</option> <option selected="selected">option</option>

Es posible que desee definir algunas otras funciones que pueden convertir la cadena a template.CSS, template.JS, template.JSStr, template.URL etc.


Debería envolver la cadena en un HTMLAttr , que fue diseñado para el texto que se inyecta entre paréntesis angulares. Según la documentación:

https://golang.org/pkg/html/template/#HTMLAttr

HTMLAttr encapsula un atributo HTML de una fuente confiable, por ejemplo, dir="ltr" .

El uso de este tipo presenta un riesgo de seguridad: el contenido encapsulado debe provenir de una fuente confiable, ya que se incluirá textualmente en la salida de la plantilla.

type HTMLAttr string


Está intentando generar HTML en un lugar donde la plantilla / html piensa que no es seguro (por ejemplo, dentro de un elemento HTML, como este:

<option {{ printSelected }}>

No puedo encontrar ninguna manera de convencerlo de que es seguro (incluido el devolver template.HTML en lugar de una cadena); La única alternativa que he encontrado es volver a escribir la plantilla, en este ejemplo use una salida bool en su lugar:

<option {{ if printSelected }}selected{{ end }}>


Tuve un problema similar con <img src="{{myfunction}}"> donde myfunction devuelve la imagen codificada.

Finalmente, lo resolví cuando en lugar de la función de cadena devuelve template.URL(mystring) .


la manera más fácil:

import "html/template" yourhref = template.URL(yourhref)