Golang шаблон не отображает HTML
Я создал подпапку "views" в моем корневом веб-каталоге. В папке View у меня есть статическая папка, которая содержит файлы css и js. HTML-страницы отображаются, когда у меня есть HTML-файлы в веб-корне. Однако они не отображаются при помещении в папку представлений. Я использую template.ParseGlob для разбора файла и ExecuteTemplate для рендеринга.
package main
import (
"html/template"
"net/http"
"github.com/gorilla/mux"
)
var router = mux.NewRouter()
var tmpl *template.Template
func init() {
tmpl = template.Must(template.ParseGlob("view/*.html"))
}
func indexPage(w http.ResponseWriter, r *http.Request) {
err := tmpl.ExecuteTemplate(w, "signin", nil)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
func main() {
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
router.PathPrefix("/").Handler(http.StripPrefix("/", http.FileServer(http.Dir("view/"))))
router.HandleFunc("/", indexPage)
http.ListenAndServe(":8091", router)
}
HTML-файлы: определили верхний и нижний колонтитулы в index.html, на который я ссылаюсь в файле signin.html
{{ define "header"}}
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>User Sign in</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/static/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/css/bootstrap-theme.min.css">
<link rel="stylesheet" href="/static/css/main.css">
<script src="/static/js/vendor/modernizr-2.8.3-respond-1.4.2.min.js"></script>
</head>
<body>
{{end}}
{{define "footer"}}
<footer class="panel-footer"><p>© Company 2016</p></footer>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.11.2.min.js"><\/script>')</script>
<script src="/static/js/vendor/bootstrap.min.js"></script>
<script src="/static/js/main.js"></script>
<!-- Google Analytics: change UA-XXXXX-X to be your site's ID. -->
<script>
(function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=
function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;
e=o.createElement(i);r=o.getElementsByTagName(i)[0];
e.src='//www.google-analytics.com/analytics.js';
r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));
ga('create','UA-XXXXX-X','auto');ga('send','pageview');
</script>
</body>
</html>
{{end}}
файл signin.html:
{{define "signin"}}
{{template "header" .}}
<h1 class="alert alert-info">Login</h1>
<div class="container">
{{with .Errors.message}}
<div class="alert alert-danger">
{{.}}
</div>
{{end}}
<form method="POST" action="/">
<label class="form-control" for="uname">User Name</label>
<input class="form-control" type="text" id="uname" name="uname">
<label class="form-control" for="password">Password</label>
<input class="form-control" type="password" id="password" name="password">
<button class="btn btn-info" type="submit">Submit</button>
</form>
{{template "footer" .}}
{{end}}
Почему это не работает, когда я помещаю HTML-файлы в подкаталог 'views'. Единственное, что меняется, - это аргумент parseGlob.
1 ответ
Я считаю, что все, что вам нужно сделать, это удалить эту строку:
router.PathPrefix("/").Handler(http.StripPrefix("/", http.FileServer(http.Dir("view/"))))
Работает для меня. Хотя вам тоже нужно немного почистить HTML - я вижу, по крайней мере, недостающее </div>
,
Шаблоны обрабатываются на сервере и не требуют обслуживания через Интернет. В то же время эта запись маршрута конфликтует со следующей (indexPage), которая определяет другой обработчик для той же записи маршрута ("/"). Поэтому, когда вы открываете его в браузере, сервер просто отправляет файлы шаблона через Интернет. Хотя обработчик indexPage никогда не вызывается, так как обработчик каталогов сопоставляется первым.
Также вы говорите о папке "views", но ваш код говорит "view" (без "s" в конце). Может быть еще одна простая причина.