具有动态内容的Golang模板标题

时间:2019-02-12 06:19:15

标签: html templates go webserver

我有一个用Golang编写的小型网络服务器,该服务器运行在一堆unix设备上。我想在我的网络服务器提供的每个页面的页眉中找到设备的名称,以便我可以知道要查看的设备。

该网络服务器有六个网页,它们都使用嵌套的标头模板。像这样:

<body>
    {{template "header"}}

header.html文件可能类似于:

{{define "header"}}
    <h1>Device Name is: {{.}}</h1>
{{end}}

我希望设备的名称(通过os.HostName()获得)位于标头中,但我不知道该怎么做。

我能做的是在程序开始时获取主机名,然后在每次调用ExecuteTemplate时将其传递回HTML。就像我说的,大约有6页,所以我必须在6个处理程序中通过ExecuteTemplate在我的处理程序函数中将此名称传递回来。像这样:

func XYZHandler(w http.ResponseWriter, r *http.Request) {
    type returnInfo struct {
        Name        string
    }
    XYZReturnInfo := returnInfo{Name: deviceName} // deviceName obtained at start of program
    tmpl.ExecuteTemplate(w, "XYZ.html", returnInfo )
}

然后HTML页面使用.Name将其注入到标题中。

但是有什么方法可以在程序启动时一次将那个deviceName值放入标头模板中?这样从那以后它就会嵌套到每个页面中?

我还应该添加在启动时也解析.html文件的信息。使用ParseFiles。

1 个答案:

答案 0 :(得分:3)

os.HostName添加为template function。在标题中调用该函数。

下面是在解析模板时定义函数的示例:

t := template.Must(template.New("").Funcs(
    template.FuncMap{"hostname": os.Hostname}).ParseFiles(fnames...))

使用如下功能:

{{define "header"}}
    <h1>Device Name is: {{hostname}}</h1>
{{end}}

Run it on the Playground