如何加载和缓存100页的模板页面,以及呈现正确的模板并返回处理程序

时间:2018-07-20 01:33:09

标签: go go-templates

我需要在Web应用程序中使用100多个模板。

是否有一种方法可以解析它们并重新使用它们,而不是针对每个请求加载它们?

现在假设模板不包含在模型中,它们只是静态模板(为了简化起见)。

模板存储在以下文件夹结构中,因此基于主题变量,我将知道从何处获取模板。

/views/{theme}/index.tmpl

所以到目前为止,我的手像这样:

func RenderPage(w http.ResponseWriter, r *http.Request) {

   var theme := // set template theme based on some condition

}

如何预加载所有模板,然后以某种方式获取正确的模板并将其呈现给该处理程序中的浏览器?

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作,加载地图,其索引是{{define“ Name”}}在模板中声明的模板名称,而其值是要解析的文件数组。然后遍历该映射,并使用这些值创建一个* template.Template并将其存储在索引为模板名称且值为* template.Template值的全局映射中。

然后找出您需要的模板,从地图中获取并执行。

package main

import (
    "html/template"
    "log"
    "net/http"
)

var templates map[string]*template.Template

func main() {
    templates = make(map[string]*template.Template)
    var template = make(map[string][]string)
    template["Home"] = []string{"home.html"}
    template["About"] = []string{"about.html"}
    template["404"] = []string{"404.html"}
    // Obviously you'd automate this ^
    loadAllTemplates(&template, templates)
    http.HandleFunc("/", renderCorrectTemplate)
    http.ListenAndServe(":8080", nil)
}

func loadAllTemplates(templateMap *map[string][]string, templates map[string]*template.Template) {
    for name, files := range *templateMap {
        t, err := template.New(name).ParseFiles(files...)
        if err != nil {
            log.Printf("Error Parsing Template: %s", err.Error())
            return
        }
        templates[name] = t
    }
}

func renderCorrectTemplate(w http.ResponseWriter, r *http.Request) {
    // This function would be different for you because you're not using GET, this is just an example.
    r.ParseForm()
    log.Println(r.URL.Query().Get("template"))
    switch r.URL.Query().Get("template") {
    case "Home":
        //Gather Needed Data
        err := templates["Home"].Execute(w, data)
        //Handle err
    case "About":
        //Gather Needed Data
        err := templates["About"].Execute(w, data)
        //Handle err
    default:
        err := templates["404"].Execute(w, data)
        //Handle err
    }
}