我创建了嵌套模板,当我使用" net / http"和http.HandelFunc,然而,我决定使用" github.com/julienschmidt/httprouter"因为我希望移动灵活性,现在我的模板不起作用,我得到404错误。
拜托,你能帮忙吗?
目录结构
/
/main.go
/templates
/templates/tstats/file.go.html
此代码有效
func init() {
tpl = template.Must(template.ParseGlob("templates/*.go.html"))
}
http.HandleFunc("/tstats/", serveTemplate)
func serveTemplate(w http.ResponseWriter, r *http.Request) {
lp := filepath.Join("templates", "layout.html")
fp := filepath.Join("templates", filepath.Clean(r.URL.Path))
gh := filepath.Join("templates", "INC_Header.go.html")
gn := filepath.Join("templates", "INC_Nav.go.html")
gf := filepath.Join("templates", "INC_Footer.go.html")
//log.Println(r.URL.Path)
tpl, err := template.ParseFiles(lp, fp, gh, gn, gf)
if err := tpl.ExecuteTemplate(w, "layout", nil); err != nil {
log.Println(err.Error())
http.Error(w, http.StatusText(500), 500)
}
生成404的新代码
func serveTemplate(w http.ResponseWriter, r *http.Request, _
httprouter.Params) {
lp := filepath.Join("templates", "layout.html")
fp := filepath.Join("templates", filepath.Clean(r.URL.Path))
gh := filepath.Join("templates", "INC_Header.go.html")
gn := filepath.Join("templates", "INC_Nav.go.html")
gf := filepath.Join("templates", "INC_Footer.go.html")
//log.Println(`enter code here`r.URL.Path)
tmpl, err := template.ParseFiles(lp, fp, gh, gn, gf)
if err := tmpl.ExecuteTemplate(w, "layout", nil); err != nil {
log.Println(err.Error())
http.Error(w, http.StatusText(500), 500)
}
答案 0 :(得分:0)
在评论回复后进行修改。我看了https://play.golang.org/p/iHUqZQQcv3
您有以下问题:
r.GET("/tstats/", serveTemplate)
- 它只与http://localhost:8080/tstats/
匹配,其余内容都是404
http://localhost:8080/tstats/myfile1.html
filepath.Join("templates", filepath.Clean(r.URL.Path))
老实说,你很难猜测,你是如何规划/设计你的应用程序的。无论如何 -
更新您的代码,如下所示:
/tstats/
=>路由器映射中的/tstats/*tmpl
fp := filepath.Join("templates", filepath.Clean(r.URL.Path))
=> fp := filepath.Join("templates", "tstats", params.ByName("tmpl"))
现在,请求http://localhost:8080/tstats/myfile1.html。它会在templates/tstats/myfile1.html
找到模板。
(这是初步回复)
似乎HandlerFunc
注册问题导致404。
我已经从您的代码创建了示例,您可以尝试https://play.golang.org/p/6ilS0htj-I
顺便说一句,我相信;在您的第一个示例代码中,tpl
中的func init
变量未被使用。由于serveTemplate
中有同名的局部变量。