2016-04-03 12 views
7

Sto usando Golang nel back-end. Quando eseguo il rendering dell'HTML utilizzando html/templates, ricevo ZgotmplZ per gli URL.Come sbarazzarsi di ZgotmplZ da html/template in Golang?

{{if .UserData.GitURL}} 
<li> 
    <a href="{{.UserData.GitURL}}"> 
    <i class="icon fa fa-github"></i> 
    </a> 
</li> 
{{end}} 

Sto usando la stringa per GitURL sul lato server. Questo URL è https. Quando ho cercato soluzioni, alcuni blog hanno suggerito di utilizzare safeURL. Così ho provato,

{{if .UserData.GitURL}} 
<li> 
    <a href="{{.UserData.GitURL | safeURL}}"> 
    <i class="icon fa fa-github"></i> 
    </a> 
</li> 
{{end}} 

Ma il codice non è stato compilato.

Qualcuno potrebbe aiutarmi con questo? Qualsiasi suggerimento sarebbe davvero utile.

+0

Assicurarsi che la stringa dell'URL sia corretta. Ad esempio produrrà 'ZgotmplZ' se il suo 'https:' con uno spazio davanti invece di 'https:' –

+3

Possibile duplicato di [Perché sto vedendo ZgotmplZ nel mio output del modello Go HTML?] (Https: // StackOverflow .com/domande/14765395/why-am-i-seeing-zgotmplz-in-my-go-html-template-output) – Carpetsmoker

risposta

6

ZgotmplZ è un valore speciale che indica che l'input non è valido. Citando dal doc di html/template:

"ZgotmplZ" is a special value that indicates that unsafe content reached a 
CSS or URL context at runtime. The output of the example will be 
    <img src="#ZgotmplZ"> 
If the data comes from a trusted source, use content types to exempt it 
from filtering: URL(`javascript:...`). 

Se si desidera sostituire un testo URL valida, niente di speciale come come è necessaria safeURL funzione. Se l'esecuzione del modello ha come risultato un valore come "#ZgotmplZ", significa che l'URL che desideri inserire non è valido.

Vedi questo esempio:

t := template.Must(template.New("").Parse(`<a href="{{.}}"></a>` + "\n")) 
t.Execute(os.Stdout, "http://google.com") 
t.Execute(os.Stdout, "badhttp://google.com") 

uscita:

<a href="http://google.com"></a> 
<a href="#ZgotmplZ"></a> 

È possibile utilizzare un valore di tipo template.URL se si desidera utilizzare un URL come sono, senza fuggire. Nota che in questo caso il valore fornito verrà utilizzato così com'è anche se non è un URL valido.

safeURL non è una sorta di funzione magica o predeterminata che è possibile utilizzare nei modelli. Ma si può registrare il proprio funzione personalizzata che restituisce un parametro string URL, un valore di tipo template.URL:

t2 := template.Must(template.New("").Funcs(template.FuncMap{ 
    "safeURL": func(u string) template.URL { return template.URL(u) }, 
}).Parse(`<a href="{{. | safeURL}}"></a>` + "\n")) 
t2.Execute(os.Stdout, "http://google.com") 
t2.Execute(os.Stdout, "badhttp://google.com") 

uscita:

<a href="http://google.com"></a> 
<a href="badhttp://google.com"></a> 

Nota: Se si è in grado di passare in un template.URL valore direttamente all'esecuzione del modello, non è necessario registrarsi e utilizzare una funzione personalizzata safeURL():

t3 := template.Must(template.New("").Parse(`<a href="{{.}}"></a>` + "\n")) 
t3.Execute(os.Stdout, template.URL("http://google.com")) 
t3.Execute(os.Stdout, template.URL("badhttp://google.com")) 

uscita:

<a href="http://google.com"></a> 
<a href="badhttp://google.com"></a> 

Prova questi sul Go Playground.

Problemi correlati