Как я могу использовать несколько HTML-шаблонов (т. е. иметь базовый шаблон или шаблон нижнего колонтитула) в Go?

Я новичок в Go и разрабатываю веб-сайт с помощью Go. Я хочу использовать несколько шаблонов, например, базовый шаблон для объединения с другими шаблонами, такими как index. Я хотел бы, чтобы все шаблоны анализировались при первом запуске приложения. На данный момент у меня есть base.html, footer.html и index.html. Я хочу обслуживать index.html, который также использует base.html и footer.html. На данный момент единственный ответ, который я получаю от сервера, — это одна новая строка в HTTP-ответе 200, проверенном wireshark. В любом случае, вот мои файлы:

main.go


    package main
      
    import (
        "html/template"
        "log"
        "net/http"
    )
    
    type Initial struct {
        Data string
    }
    
    var cached_templates = template.Must(template.ParseFiles("templates/base.html",
                                                             "templates/footer.html",
                                                             "templates/index.html"))
    
    func renderInitialTemplate(w http.ResponseWriter, _template string, data *Initial) {
        err := cached_templates.ExecuteTemplate(w, _template, data)
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
    }
    
    func indexHandler(w http.ResponseWriter, r *http.Request) {
        data := &Initial{Data: "Bob"}
        renderInitialTemplate(w, "index.html", data)
    }
    
    func main() {
        http.HandleFunc("/", indexHandler)
        log.Fatal(http.ListenAndServe(":80", nil))
    }

index.html – https://pastebin.com/LPy0Xb2Z

footer.html – https://pastebin.com/vVenX4qE

base.html – https://pastebin.com/1jKxv7Uz

Я ценю любую помощь. Спасибо.


person buckc    schedule 17.08.2020    source источник


Ответы (1)


html/template есть вариант решения вашей проблемы. вы можете использовать такой шаблон:

main.html

{{define "main"}}
<!DOCTYPE html>
<html lang="en">
<body>
{{template "header" .}}

{{template "content" .}}

{{template "footer" .}}
</body>
</html>
{{end}}

заголовок.html

{{define "header"}}
// some header codes or menu or etc.
{{end}}

нижний колонтитул.html

{{define "footer"}}
// some header codes or menu or etc.
{{end}}

для рендеринга index страницы вы можете сделать так:

tmpl, err := template.New("").ParseFiles("index.html", "main.html")
if err != nil {
    panic(err.Error())
}
err = tmpl.ExecuteTemplate(w, "main", whateverContext)
person ttrasn    schedule 17.08.2020
comment
Спасибо, что нашли время ответить @ttrasn. Когда у меня будет возможность позже днем/ночью, я обязательно попробую это и сообщу здесь о своих результатах. Судя по вашему ответу, мне придется анализировать шаблоны каждый раз, когда я их использую, верно? В основном я следовал руководству ( golang.org/doc/articles/wiki ), где один просто нужно разобрать все шаблоны один раз при запуске приложения, а затем просто выполнить шаблон, когда это необходимо, но если синтаксический анализ каждого запроса является правильным решением, пусть будет так. Спасибо еще раз. - person buckc; 17.08.2020