Golang для создания главной страницы макета - PullRequest
0 голосов
/ 13 декабря 2018

Я новичок в Golang и пытаюсь запустить веб-сервер с помощью Go.Я уже написал html, css и js для основного макета, но у меня возникают проблемы с отображением веб-сайта после запуска сервера.

Использование этой страницы в качестве руководства ссылка .Просто используя мои собственные написанные html, CSS и JS файлы в качестве визуального макета.

Что происходит, так это то, что заголовок, нижний колонтитул и т. Д. Прекрасно сочетаются, но отображаются в виде текста в браузере, с тегами и всем остальным.Я не уверен, почему это не отображается должным образом.Я не уверен, может ли это быть, потому что я не рендеринг в виде HTML с использованием templates.HTML, но я не могу найти много информации по этому вопросу.Спасибо всем заранее!Введите код, указанный ниже: Ссылка на Github

 package main

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

type Page struct {
    Title string
}

//-------------------------------------------------------------------------------------//
//Compile templates on start
var templ = func() *template.Template {
    t := template.New("")
    err := filepath.Walk("./", func(path string, info os.FileInfo, err error) error {
        if strings.Contains(path, ".html") {
            fmt.Println(path)
            _, err = t.ParseFiles(path)
            if err != nil {
                fmt.Println(err)
            }
        }
        return err
    })

    if err != nil {
        panic(err)
    }
    return t
}()

//---------------------------------------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 {
        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 {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}

//Handler for test Page
func testHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method == "GET" {
        fmt.Println("Test")
        testT, _ := template.ParseFiles("static/test.html")
        testT.Execute(w, nil)
    }
}

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

    http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
    //---------------------------------------------------------------------------------//

    //log to file
    f, err := os.OpenFile("serverlog.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
    if err != nil {
        log.Fatalf("Error opening file: %v", err)
    }
    defer f.Close()
    logger := log.New(f, "Logged : ", log.LstdFlags)
    log.SetOutput(f)

    //start server
    logger.Println("Starting server on port 9090")
    logger.Fatal(http.ListenAndServe(":9090", nil))

}

Редактировать: Обновлено 20181214

Каталог файлов

Снимок веб-страницы после обновления кода

Мой HTML-код в основном тот же формат, что и веб-сайт, но у меня есть некоторые JavaScript и локальные CSS-файлы, которые являются частью моего HTML (только дляпростой переход, без jquery).Может ли это повлиять на разбор?Версия Go go version go1.10.1 windows/amd64

Решено: Обновлено 20181215

Спасибо @AR за указание на проблему с моим заголовком html, содержащим дополнительные символы!

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Вы не следуете учебнику точно так, как кажется.

Вам не хватает свойства " .Title ", которое требуется в шаблоне " header ", здесь происходит сбой.

(если вы откроете свои инструменты разработчика, вы увидите, что индекс или страницы разбиты и неправильно проанализированы)

Пожалуйста, добавьте структуру страницы в ваш код

//A Page structure
type Page struct {
    Title string
}

Используется в функциях-обработчиках

//Handler for homepage
func homepageHandler(w http.ResponseWriter, r *http.Request) {
    display(w, "main", &Page{Title: "Home"})
}

И вызывается в функции отображения

func display(w http.ResponseWriter, tmpl string, data interface{}) {
    templ.ExecuteTemplate(w, tmpl, data)
}

Еще одна вещь в обработчике вашей домашней страницы, которую вы вызываете ExecuteTemplateс "index"

//Handler for homepage
func homepageHandler(w http.ResponseWriter, r *http.Request) {
    templ.ExecuteTemplate(w, "index", "Welcome to TL;DR")
}

Это должно соответствовать шаблону " main.html " как

{{define "index"}}
0 голосов
/ 13 декабря 2018

Попробуйте это (работает для меня):

package main

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

func homepageHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Println("Home")
    templ.ExecuteTemplate(w, "main", &Page{Title: "Welcome to TL;DR"})
}
func aboutHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Println("About")
    templ.ExecuteTemplate(w, "about", &Page{Title: "About TL;DR"})
}
func main() {
    http.HandleFunc("/", homepageHandler)
    http.HandleFunc("/about", aboutHandler)
    fmt.Println("Server started on port 8080")
    fmt.Println(http.ListenAndServe(":8080", nil))
}

var templ = func() *template.Template {
    t := template.New("")
    err := filepath.Walk("./", func(path string, info os.FileInfo, err error) error {
        if strings.Contains(path, ".html") {
            fmt.Println(path)
            _, err = t.ParseFiles(path)
            if err != nil {
                fmt.Println(err)
            }
        }
        return err
    })

    if err != nil {
        panic(err)
    }
    return t
}()

type Page struct {
    Title string
}

main.html содержимое файла:

{{define "main"}}
{{template "header" .}}
<div class="content">
    <h2>Main</h2>
    <div>This is the Main page</div>
</div>
{{template "footer" .}}
{{end}}

about.html содержимое файла:

{{define "about"}}
{{template "header" .}}
<div class="content">
    <h2>About</h2>
    <div>This is the About page</div>
</div>
{{template "footer" .}}
{{end}}

footer.html содержимое файла:

{{define "footer"}}
<p class="navbar-text navbar-fixed-bottom">Go Rocks!</p>
<script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
</body>

</html>
{{end}}

header.html содержимое файла:

{{define "header"}}
<!DOCTYPE html>
<html>

<head>
    <title>{{.Title}}</title>
    <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css">
    <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-theme.min.css">
    <style type="text/css">
        body {
            padding-bottom: 70px;
        }

        .content {
            margin: 10px;
        }
    </style>
</head>

<body>
    <nav class="navbar navbar-default" role="navigation">
        <div class="navbar-header">
            <a class="navbar-brand" href="/">Go App</a>
        </div>
        <div class="collapse navbar-collapse navbar-ex1-collapse">
            <ul class="nav navbar-nav">
                <li><a href="/">Main</a></li>
                <li><a href="/about">About</a></li>
            </ul>
        </div>
    </nav>
    {{end}}

Примечания:
И см. это для шаблонов.

Редактировать: в вашем static/template/header.html файле в строке 2 удалите лишние </ до <!DOCTYPE html> (внутри красного кружка на этом изображении): enter image description here

...