опять застрял.Я экспериментировал с Голангом, используя эту страницу в качестве руководства для шаблонов для создания главной страницы.Мне удалось запустить сервер Go с правильно обновленными каталогами CSS и JS, но я могу загрузить только страницу index.html
, а не страницу about.html
. Ссылка Github здесь
Я уже пробовал решения в здесь и здесь но не повезло, и страница о, и страница указателя находятся водин и тот же каталог и общие шаблоны заголовка, нижнего колонтитула и панели навигации.
Я также попытался выполнить синтаксический анализ файлов вручную с помощью template.Must(template.ParseFiles("header.html", .....
, а также попытался выполнить файл с расширением .html с именем templ.ExecuteTemplate(w, "about.html", &Page{Title: "About TL;DR"})
, который не возвращает ошибку, а вместо этого просто загружает пустой экран.Любая помощь будет принята с благодарностью, заранее спасибо!
Каталог файлов:
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))
}
Страница ошибки
Также я заметил, что независимо от того, какую страницу я загружаю, она всегда будет выполнять homepageHandler
после выполнения aboutHandler
как видно из консоли.
Редактировать: Решено 20181215 Неправильное определение шаблона about.html
, изменить на{{define "about"}}
решил проблему.