如何使模板与 gin 框架一起工作?
How to make templates work with gin framework?
我是 golang 新手。
为了学习它,我从一个使用 gin 框架的简单 Web 应用程序开始。
我遵循了 gin doc 和配置的模板文件,但无法使其工作。我收到一个错误 -
panic: html/template: pattern matches no files: `templates/*`
goroutine 1 [running]:
html/template.Must
/usr/local/Cellar/go/1.5.2/libexec/src/html/template/template.go:330
github.com/gin-gonic/gin.(*Engine).LoadHTMLGlob
/Users/ameypatil/deployment/go/src/github.com/gin-gonic/gin/gin.go:126
main.main()
/Users/ameypatil/deployment/go/src/github.com/ameykpatil/gospike/main.go:17
下面是我的代码 -
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
//os.Setenv("GIN_MODE", "release")
//gin.SetMode(gin.ReleaseMode)
// Creates a gin router with default middleware:
// logger and recovery (crash-free) middleware
router := gin.Default()
router.LoadHTMLGlob("templates/*")
//router.LoadHTMLFiles("templates/index.tmpl")
router.GET("/", func(c *gin.Context) {
c.HTML(http.StatusOK, "index.tmpl", gin.H{
"title": "GoSpike",
})
})
// By default it serves on :8080 unless a
// PORT environment variable was defined.
router.Run(":4848")
}
我的目录结构是
- gospike
--- templates
------index.tmpl
--- main.go
go install
命令没有给出任何错误
但实际上运行,它给出了上述错误。我搜索并在杜松子酒的 github 回购中记录了类似的问题,但它们现在已关闭。
我尝试了各种方法,但我想我遗漏了一些明显的东西。我错过了什么?
我猜问题出在您使用相对文件路径访问您的模板。
如果我从 gospike
目录 编译并 运行 你的代码 ,它工作正常。但是如果我从任何其他目录 运行 gospike
,我会得到与您看到的相同的错误。
所以要么在templates
的父目录下总是运行gospike
,要么使用绝对路径。您可以对其进行硬编码:
router.LoadHTMLGlob("/go/src/github.com/ameykpatil/gospike/templates/*")
或者你可以做类似
的事情
router.LoadHTMLGlob(filepath.Join(os.Getenv("GOPATH"),
"src/github.com/ameykpatil/gospike/templates/*"))
但如果您在 GOPATH
中设置了多个路径,那将失败。一个更好的长期解决方案可能是设置一个特殊的环境变量,如 TMPL_DIR
,然后只使用它:
router.LoadHTMLGlob(filepath.Join(os.Getenv("TMPL_DIR"), "*"))
使用相对路径 glob 会起作用,你可以尝试编码
router.LoadHTMLGlob("./templates/*")
注意.
点符号,表示当前目录,gin.Engine将加载模板
基于当前目录的 templates
子目录。
这是我的做法。这会遍历目录并收集标有我的模板后缀 .html 的文件,然后我只包含所有这些文件。我在任何地方都没有看到这个答案,所以我想我 post 它。
// START UP THE ROUTER
router := gin.Default()
var files []string
filepath.Walk("./views", func(path string, info os.FileInfo, err error) error {
if strings.HasSuffix(path, ".html") {
files = append(files, path)
}
return nil
})
router.LoadHTMLFiles(files...)
// SERVE STATICS
router.Use(static.Serve("/css", static.LocalFile("./css", true)))
router.Use(static.Serve("/js", static.LocalFile("./js", true)))
router.Use(static.Serve("/images", static.LocalFile("./images", true)))
routers.LoadBaseRoutes(router)
routers.LoadBlog(router)
router.Run(":8080")
有一个 multitemplate HTML 渲染来支持多模板。
您可以使用AddFromFiles
添加多个文件:
r.AddFromFiles("index", "templates/base.html", "templates/index.html")
r.AddFromFiles("article", "templates/base.html", "templates/index.html", "templates/article.html")
或者在一个目录下加载多个文件:
package main
import (
"path/filepath"
"github.com/gin-contrib/multitemplate"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.New()
r.HTMLRender = loadTemplates()
// ...
}
func loadTemplates() multitemplate.Render {
files, err := filepath.Glob("template/*.tmpl")
if err != nil {
panic("failed to load html templates: " + err.Error())
}
r := multitemplate.New()
// Generate our templates map from our template/ directories
for _, file := range files {
r.AddFromFiles(filepath.Base(file), file)
}
// add other html templates directly
r.Add("test.tmpl", someTemplate)
return r
}
你可以在这个 repo 中看到更多你想要的 API,希望这个 post 帮助 :)
我是 golang 新手。 为了学习它,我从一个使用 gin 框架的简单 Web 应用程序开始。 我遵循了 gin doc 和配置的模板文件,但无法使其工作。我收到一个错误 -
panic: html/template: pattern matches no files: `templates/*` goroutine 1 [running]: html/template.Must /usr/local/Cellar/go/1.5.2/libexec/src/html/template/template.go:330 github.com/gin-gonic/gin.(*Engine).LoadHTMLGlob /Users/ameypatil/deployment/go/src/github.com/gin-gonic/gin/gin.go:126 main.main() /Users/ameypatil/deployment/go/src/github.com/ameykpatil/gospike/main.go:17
下面是我的代码 -
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
//os.Setenv("GIN_MODE", "release")
//gin.SetMode(gin.ReleaseMode)
// Creates a gin router with default middleware:
// logger and recovery (crash-free) middleware
router := gin.Default()
router.LoadHTMLGlob("templates/*")
//router.LoadHTMLFiles("templates/index.tmpl")
router.GET("/", func(c *gin.Context) {
c.HTML(http.StatusOK, "index.tmpl", gin.H{
"title": "GoSpike",
})
})
// By default it serves on :8080 unless a
// PORT environment variable was defined.
router.Run(":4848")
}
我的目录结构是
- gospike
--- templates
------index.tmpl
--- main.go
go install
命令没有给出任何错误
但实际上运行,它给出了上述错误。我搜索并在杜松子酒的 github 回购中记录了类似的问题,但它们现在已关闭。 我尝试了各种方法,但我想我遗漏了一些明显的东西。我错过了什么?
我猜问题出在您使用相对文件路径访问您的模板。
如果我从 gospike
目录 编译并 运行 你的代码 ,它工作正常。但是如果我从任何其他目录 运行 gospike
,我会得到与您看到的相同的错误。
所以要么在templates
的父目录下总是运行gospike
,要么使用绝对路径。您可以对其进行硬编码:
router.LoadHTMLGlob("/go/src/github.com/ameykpatil/gospike/templates/*")
或者你可以做类似
的事情router.LoadHTMLGlob(filepath.Join(os.Getenv("GOPATH"),
"src/github.com/ameykpatil/gospike/templates/*"))
但如果您在 GOPATH
中设置了多个路径,那将失败。一个更好的长期解决方案可能是设置一个特殊的环境变量,如 TMPL_DIR
,然后只使用它:
router.LoadHTMLGlob(filepath.Join(os.Getenv("TMPL_DIR"), "*"))
使用相对路径 glob 会起作用,你可以尝试编码
router.LoadHTMLGlob("./templates/*")
注意.
点符号,表示当前目录,gin.Engine将加载模板
基于当前目录的 templates
子目录。
这是我的做法。这会遍历目录并收集标有我的模板后缀 .html 的文件,然后我只包含所有这些文件。我在任何地方都没有看到这个答案,所以我想我 post 它。
// START UP THE ROUTER
router := gin.Default()
var files []string
filepath.Walk("./views", func(path string, info os.FileInfo, err error) error {
if strings.HasSuffix(path, ".html") {
files = append(files, path)
}
return nil
})
router.LoadHTMLFiles(files...)
// SERVE STATICS
router.Use(static.Serve("/css", static.LocalFile("./css", true)))
router.Use(static.Serve("/js", static.LocalFile("./js", true)))
router.Use(static.Serve("/images", static.LocalFile("./images", true)))
routers.LoadBaseRoutes(router)
routers.LoadBlog(router)
router.Run(":8080")
有一个 multitemplate HTML 渲染来支持多模板。
您可以使用AddFromFiles
添加多个文件:
r.AddFromFiles("index", "templates/base.html", "templates/index.html")
r.AddFromFiles("article", "templates/base.html", "templates/index.html", "templates/article.html")
或者在一个目录下加载多个文件:
package main
import (
"path/filepath"
"github.com/gin-contrib/multitemplate"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.New()
r.HTMLRender = loadTemplates()
// ...
}
func loadTemplates() multitemplate.Render {
files, err := filepath.Glob("template/*.tmpl")
if err != nil {
panic("failed to load html templates: " + err.Error())
}
r := multitemplate.New()
// Generate our templates map from our template/ directories
for _, file := range files {
r.AddFromFiles(filepath.Base(file), file)
}
// add other html templates directly
r.Add("test.tmpl", someTemplate)
return r
}
你可以在这个 repo 中看到更多你想要的 API,希望这个 post 帮助 :)