html / template:“ xxx”是一页的未定义错误,而不是另一页

时间:2018-12-15 12:16:11

标签: html go

再次

我被卡住了。我一直在尝试使用page作为模板的Golang模板来创建母版页。我已经设法通过正确更新了CSS和JS目录的方式启动了Go服务器,但是我只能加载index.html页而不是about.html页。 Github link here

我已经在herehere中尝试了解决方案,但是没有运气,关于页面和索引页面都在同一目录中,并且共享相同的页眉,页脚和导航栏模板。

我还尝试使用template.Must(template.ParseFiles("header.html", .....手动解析文件,还尝试使用名称为templ.ExecuteTemplate(w, "about.html", &Page{Title: "About TL;DR"})的.html执行,这不会返回错误,而是仅加载空白屏幕。任何帮助将不胜感激,在此先感谢您!

文件目录:

File directory structure

servermain.go

package main

    import (
        "fmt"
        "html/template"
        "log"
        "net/http"
        "os"
        "path/filepath"
        "strings"
    )

    //Page title
    type Page struct {
        Title string
    }

    //------------------------------Global Variables-------------------------------------//
    //Compile templates on start
    var templ = ParseTemplates()

    //ParseTemplates use for multi directory html parsing
    func ParseTemplates() *template.Template {
        t := template.New("Base")
        err := filepath.Walk("./", func(path string, info os.FileInfo, err error) error {
            if strings.Contains(path, ".html") {
                _, err = t.ParseFiles(path)
                fmt.Println(path)
                if err != nil {
                    logger.Println(err)
                    fmt.Println(err)
                }
            }

            return err
        })

        if err != nil {
            panic(err)
        }

        return t
    }

    //logging
    var errorlog *os.File
    var logger *log.Logger

    //---------------------------------------Page Handlers----------------------------------//
    //Handler for homepage
    func homepageHandler(w http.ResponseWriter, r *http.Request) {
        fmt.Println("Home")
        err := templ.ExecuteTemplate(w, "index", &Page{Title: "Welcome to TL;DR"})
        if err != nil {
            fmt.Println(err)
            logger.Println(err)
            http.Error(w, err.Error(), http.StatusInternalServerError)
        }
    }

    //Handler for about page
    func aboutHandler(w http.ResponseWriter, r *http.Request) {
        fmt.Println("About")
        err := templ.ExecuteTemplate(w, "about", &Page{Title: "About TL;DR"})
        if err != nil {
            fmt.Println(err)
            logger.Println(err)
            http.Error(w, err.Error(), http.StatusInternalServerError)
        }
    }

    //Server log to file
    func init() {
        errorlog, err := os.OpenFile("serverlog.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
        if err != nil {
            fmt.Printf("Error opening file: %v", err)
            os.Exit(1)
        }
        log.SetOutput(errorlog)
        logger = log.New(errorlog, "\r\nTDLR : ", log.Lshortfile|log.LstdFlags)
    }

    func main() {
        //--------------------------------------Routers-------------------------------------//
        http.HandleFunc("/", homepageHandler)
        http.HandleFunc("/index", homepageHandler)
        http.HandleFunc("/about", aboutHandler)

        http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
        //---------------------------------------------------------------------------------//
        //start server
        fmt.Println("Starting server on port 9090")
        logger.Println("Starting server on port 9090")
        logger.Fatal(http.ListenAndServe(":9090", nil))

    }

错误页面

Error page

我也注意到,无论加载到哪个页面,它都会在执行homepageHandler之后始终执行aboutHandler,就像在控制台中看到的那样。

Console result

编辑:已解决20181215 about.html模板定义不正确,更改为{{define "about"}}解决了该问题。

1 个答案:

答案 0 :(得分:0)

我在PC上测试了您的代码,效果很好。 如果您看到带有about.html(名称为.html)的空白屏幕,则可能是模板的问题。
确保在about.html

中包含以下代码
{{.Title}}