【发布时间】:2021-01-11 04:42:19
【问题描述】:
我在通过 r.HTMLRender 设置使用 Gin 框架加载 html 模板时遇到了一些问题。
好像没有找到模板。
我尝试使用以下助手:
- GinHTML 渲染:https://gist.github.com/madhums/4340cbeb36871e227905
- EZ 杜松子酒模板:https://github.com/michelloworld/ez-gin-template
在设置模板的默认路径时,这些似乎都不起作用(在我的例子中是 app/views);为了达到这个目的,我的 html 模板文件结构如下所示:
/workspace
|-app
|-views
|-layouts
|-application.html
|-test.html
这里是 Gin 加载代码的示例:
import (
"github.com/gin-contrib/location"
"github.com/gin-gonic/gin"
"fmt"
"os"
"github.com/gin-gonic/contrib/static"
"github.com/michelloworld/ez-gin-template"
)
//CORSMiddleware ...
func CORSMiddleware() gin.HandlerFunc {
/** CORS middleware **/
}
func Router() {
if os.Getenv("ENVIRONMENT") == "production" {
gin.SetMode(gin.ReleaseMode)
}
// Initialize Gin object
r := gin.Default()
// Cors Middleware
r.Use(CORSMiddleware())
// Rate limiting
rl, err := helpers.RateLimiterMiddleware()
if err != nil {
panic("Rate Limiting Initialization error")
}
r.Use(rl)
// Asset provision
r.Use(static.ServeRoot("/public","app/assets"))
// Get URL information
r.Use(location.Default())
// Attempt with EZ Template, fails
// I ge this error: "runtime error: invalid memory address or nil pointer dereference" when calling c.HTML(...)
render := eztemplate.New()
render.TemplatesDir = "app/views/" // default
render.Layout = "layouts/application" // default
render.Ext = ".html" // default
render.Debug = true // default
r.HTMLRender = render.Init()
// Attempt with GinHTMLRender, fails
// I get this error: https://gist.github.com/madhums/4340cbeb36871e227905#file-gin_html_render-go-L110
/*
htmlRender := GinHTMLRender.New()
htmlRender.TemplatesDir = "app/views/"
htmlRender.Debug = gin.IsDebugging()
htmlRender.Layout = "layouts/application"
log.Println("Dir:"+htmlRender.TemplatesDir)
r.HTMLRender = htmlRender.Create()*/
/** Some Routes **/
// Start web listener
r.Run(":8009") // listen and serve on 0.0.0.0:8080
}
对应的渲染调用代码如下:
/* c is of type *gin.Context */
c.HTML(200, "test", "")
由于某种原因,r.HTMLRender 函数似乎没有考虑模板路径;我尝试过这样做:
_, err := template.ParseFiles("app/views/test.html")
if err != nil {
log.Println("Template Error")
} else {
log.Println("No Template Error")
}
此代码始终显示“无模板错误”,这让我相信HTMLRender 赋值没有考虑TemplatesDir 设置变量。
我已经被这个问题困扰了一段时间,我不完全确定如何解决它。
任何帮助使其工作的帮助将不胜感激。
【问题讨论】:
-
你试过
LoadHTMLGlob()或LoadHTMLFiles()从gin-gonic/gin#html-rendering吗? -
我想在渲染页面时采用辅助方式来减少手动加载每个模板。我实际上已经找到了 EZ Gin 模板问题的根源,尽管我没有再次尝试使用 GinRenderHTML。我将发布我的发现作为我问题的答案。感谢您的建议。