Как заставить шаблоны работать с gin framework?

Я новичок в голанге. Чтобы изучить это, я начал с простого веб-приложения, используя структуру gin. Я следил за документом gin и настроил файл шаблона, но не смог заставить его работать. Я получаю сообщение об ошибке -

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 команда не выдает никакой ошибки

но при фактическом запуске выдает вышеуказанную ошибку. Я искал, и в репозитории gin на github были зарегистрированы похожие проблемы, но теперь они закрыты. Я пробовал разные вещи, но, думаю, мне не хватает чего-то очевидного. Что мне не хватает?


person ameykpatil    schedule 26.06.2016    source источник


Ответы (3)


Я предполагаю, что проблема в том, что вы используете относительный путь к файлу для доступа к своим шаблонам.

Если я скомпилирую и запущу ваш код из каталога gospike, он будет работать нормально. Но если я запущу gospike из любого другого каталога, я получу ту же ошибку, что и вы.

Поэтому либо вам нужно всегда запускать gospike в родительском каталоге templates, либо вам нужно использовать абсолютный путь. Вы можете либо жестко закодировать его:

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"), "*"))
person Tom Cleveland    schedule 26.06.2016

использовать относительный путь будет работать, вы можете попробовать закодировать

router.LoadHTMLGlob("./templates/*")

обратите внимание на знак точки ., который означает текущий каталог, gin.Engine загрузит базу шаблонов в подкаталог templates текущего каталога.

person yAnGwAwA    schedule 03.01.2021

Вот как я это делаю. Это проходит через каталог и собирает файлы, отмеченные суффиксом моего шаблона, который является .html, а затем я просто включаю их все. Я нигде не видел этого ответа, поэтому решил опубликовать его.

// 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")
person Cengleby    schedule 10.01.2021