2017-06-14 50 views
0

我創建了嵌套的模板,當我使用「net/http」和http.HandelFunc時,但是,我決定使用「github.com/julienschmidt/httprouter」我想要有靈活性,現在我的模板不起作用,我收到了404錯誤。golang模板不能使用httprouter

請問,你能幫忙嗎?

目錄結構

/ 
/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

我希望你的意思是'http.HandleFunc',而不是['http.HandelFunc'](https://www.youtube.com/watch?V = 71NCzuDNUcg)。 – Flimzy

回答

0

修改意見回覆後。我當時一看https://play.golang.org/p/iHUqZQQcv3

你有以下問題:

  1. 路由器處理器寄存器問題r.GET("/tstats/", serveTemplate) - 它只會匹配http://localhost:8080/tstats/其餘一切都是404
    • 對於如:404 - >http://localhost:8080/tstats/myfile1.html
  2. 您計算模板路徑文件的方式filepath.Join("templates", filepath.Clean(r.URL.Path))

老實說,很難猜測,你是如何規劃/設計你的應用程序。 Anyway-

更新您的代碼如下圖所示:

  • 變化/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


(這是初始響應)

好像是導致404

我從你的代碼創建的樣本HandlerFunc註冊問題,您可以嘗試https://play.golang.org/p/6ilS0htj-I

順便說一句,我相信;在您的第一個示例代碼tpl中,func init中的變量未被使用。由於您在serveTemplate中有相同名稱的本地變量。

+0

嘿,謝謝你的答案,我一直在使用Go大約4周,非常新。我嘗試了你的解決方案,但仍然得到了相同的404錯誤。 – aircandyman

+0

對於404,這肯定是你的路由器分配/創建問題。你可以把你的代碼放在play.golang.org並分享它嗎?我會看一下。 – jeevatkm

+0

乾草,它在這裏。我一直在玩它,所以我評論了一些東西。 https://play.golang.org/p/iHUqZQQcv3 – aircandyman