繁体   English   中英

Go HTML 模板:我可以停止模板包在脚本中的字符串周围插入引号吗?

[英]Go HTML templates: Can I stop the templates package inserting quotes around strings in scripts?

我的所有模板都有一个变量,指示其关联图像的根 url。 我想在模板正文中的图像文件名之前输出该根目录,但是当我这样做时,模板包会尝试在其周围加上引号。 这是显示我的问题的一小段代码。 IMG_ROOT 是本例中用来更好模拟真实代码的接口。 脚本类型为 text/template,因为其内容将用于 underscore.js 模板。 不过,类型似乎与其输出方式无关。

package main

import (
    "html/template"
    "os"
)

type Data struct {
    IMG_ROOT interface{}
}

const tmpl = `
<body>
<script type="text/template">
    <img src="{{.IMG_ROOT}}/file_name.jpg"></img>
</script>
</body>

`

func main() {
    t, _ := template.New("").Parse(tmpl)
    t.Execute( os.Stdout, &Data{ template.JSStr( "/path/to/file" ) } )
}

http://play.golang.org/p/wg9JK2w2lt

如果我写<img src="{{.IMG_ROOT}}/file_name.jpg"></img> ,我会得到无效的"\\/path\\/to\\/file/file_name.jpg"

如果我写<img src={{.IMG_ROOT}}/file_name.jpg></img> ,我得到"/path/to/file/"file_name.jpg这也不起作用。

有解决方法吗? 我已经尝试将模板包中的每个“安全”类型用于 IMG_ROOT 类型,但没有任何运气。 我可以编写一个连接并返回根和文件的函数,但似乎应该有一个更简单的解决方案。

有任何想法吗?

谢谢!

您可以使用printf内置函数:

<img src={{printf "%s/file_name.jpg" .IMG_ROOT}}></img>

http://play.golang.org/p/2v8Q6wHu0r

但相反,我建议创建一个自定义的辅助函数并使用它来创建这样的路径:

const ImageRoot = "path/to/files/"

func StaticFile(filename string) string {
    return ImageRoot + filename
}

func main() {
    t, _ := template.New("").Funcs(template.FuncMap{"staticFile": StaticFile}).Parse(tmpl)
    t.Execute(os.Stdout, nil)
}

然后在你的模板中你可以做

<img src="{{staticFile "image.jpg"}}"></img>

http://play.golang.org/p/NQTHmqNeT0

这是因为html/template转义以防止攻击等。我遇到了类似的问题。 切换到text/template使我的模板按预期运行。 也就是说,我将使用另一种方法来获取我需要的输出并继续使用html/template

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM