Rumah >pembangunan bahagian belakang >Golang >Melarikan diri '/' dalam templat

Melarikan diri '/' dalam templat

WBOY
WBOYke hadapan
2024-02-06 09:45:081071semak imbas

Melarikan diri / dalam templat

Kandungan soalan

Saya mahu menghantar rentetan seperti "avatars/avatar.png" tetapi apabila saya menghantarnya ke templat saya mendapat pelepasan watak. Jadi saya menulis fungsi yang dihantar ke templat:

var tpl *template.Template

func init() {
    tpl = template.Must(template.ParseGlob("1Forum/static/html/*.html"))
    tpl = tpl.Funcs(template.FuncMap{
        "unescape": func(s string) string {
            unescaped, err := url.PathUnescape(s)
            if err != nil {
                return s
            }
            return unescaped
        },
    })
}

{{unescape .User.Avatar}}

Tetapi saya masih mendapat "undefined function 'unescape'". Adakah unescape tidak ditakrifkan?

"net/url" telah diimport.


Jawapan betul


unescape tidak ditakrifkan?

Secara teknikal tidak. Anda memang mentakrifkannya, tetapi anda melakukannya terlalu terlambat. Sama ada fungsi ditakrifkan disemak semasa penghuraian, bukan semasa pelaksanaan. Anda ada parseglob ,然后您执行 tpl.func(...) . Ini bukan perkara biasa.

Sebaliknya lakukan ini:

func init() {
    tpl = template.Must(template.New("t").Funcs(template.FuncMap{
        "unescape": func(s string) string {
            unescaped, err := url.PathUnescape(s)
            if err != nil {
                return s
            }
            return unescaped
        },
    }).ParseGlob("1Forum/static/html/*.html"))
}

Sila ambil perhatian bahawa melarikan diri ialah ciri selamat yang berlaku bergantung pada konteks anda bekerja dengan data masuk, dan unescape 可能不会帮助您“欺骗”您的方式,因为转义将会完成在 unescape pada output, bukan pada inputnya.

Dalam erti kata lain, apabila anda melakukan {{unescape .}}, penghurai boleh menukarnya kepada {{unescape }} bergantung pada konteks (urlescaper ialah fungsi melarikan diri dalaman). Untuk mengelakkan ini, apabila anda ingin menggunakan {{unescape .}} 时,解析器可能会根据上下文将其转换为 {{unescape . | urlescaper}}urlescaper 是一个内部转义函数)。为了避免这种情况,当您想要在模板中逐字使用已知的安全字符串时,您应该使用 输入字符串而不是 unescaperentetan selamat yang dikenali

secara literal dalam templat, anda harus menggunakan Enter rentetan

bukannya unescape. Lihat

Contoh Taman Permainan

. Untuk mendapatkan maklumat lanjut tentang konteks, melarikan diri, menaip rentetan, dsb., baca

dokumentasi pakej🎜, semuanya diterangkan dengan jelas. 🎜

Atas ialah kandungan terperinci Melarikan diri '/' dalam templat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam