#go #go-html-template
#Вперед #go-html-template
Вопрос:
Я новичок в Go и разрабатываю веб-сайт с помощью Go. Я хочу использовать несколько шаблонов, таких как базовый шаблон, для объединения с другими шаблонами, такими как index . Я бы хотел, чтобы весь синтаксический анализ шаблонов выполнялся при первом запуске приложения. На данный момент у меня есть base.html , footer.html и index.html . Я хочу служить index.html который использует base.html и footer.html также. На данный момент единственный ответ, который я получаю от сервера, — это единственный перевод строки в 200 HTTP-ответах, проверенных 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 := amp;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
Я ценю любую помощь. Спасибо.
Ответ №1:
html/template
есть вариант для вашей проблемы. вы можете использовать шаблон, подобный этому:
main.html
{{define "main"}}
<!DOCTYPE html>
<html lang="en">
<body>
{{template "header" .}}
{{template "content" .}}
{{template "footer" .}}
</body>
</html>
{{end}}
header.html
{{define "header"}}
// some header codes or menu or etc.
{{end}}
footer.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)
Комментарии:
1. Спасибо, что нашли время ответить @ttrasn. Когда у меня появится возможность позже днем / ночью, я обязательно попробую это и обновлю здесь свои результаты. Судя по вашему ответу, мне придется анализировать шаблоны каждый раз, когда я их использую, правильно? Я в основном следовал руководству ( golang.org/doc/articles/wiki ) где нужно просто проанализировать все шаблоны один раз при запуске приложения, а затем просто выполнить шаблон при необходимости, но если синтаксический анализ по каждому запросу является правильным решением, пусть будет так. Еще раз спасибо.