2017-01-19 2 views
0

내 웹 루트 디렉토리에 '보기'라는 하위 폴더를 만들었습니다. 보기 폴더 내에서 CSS 및 js 파일이 들어있는 정적 폴더가 있습니다. 웹 루트에 html 파일이있을 때 html 페이지가 렌더링됩니다. 그러나 뷰 폴더 내에 배치되면 렌더링되지 않습니다. template.ParseGlob을 사용하여 파일을 구문 분석하고 ExecuteTemplate을 렌더링합니다.Golang 템플릿이 html을 렌더링하지 않습니다.

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 파일 :

{{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}} 

가 왜 : 나는 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>&copy; 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 파일을 refernce를 index.html을에 머리글과 바닥 글을 정의 html 파일을 하위 디렉토리 'views'에 배치하면 작동하지 않습니다. 변경되는 유일한 것은 parseGlob의 인수입니다. 나를 위해

router.PathPrefix("/").Handler(http.StripPrefix("/", http.FileServer(http.Dir("view/")))) 

작품 : 나는 당신이해야 할 모든 생각

+1

폴더 구조를 tree와 (과) 공유 할 수 있습니까? –

답변

0

이 줄을 제거합니다. 비록 당신이 너무 HTML을 청소해야합니다 - 적어도 누락 된 </div>을 참조하십시오.

템플릿은 서버에서 처리되므로 인터넷을 통해 제공 할 필요가 없습니다. 동시에이 경로 항목은 동일한 경로 항목 ("/")에 대한 다른 처리기를 정의하는 다음 항목 (indexPage)과 충돌합니다. 따라서 브라우저에서 열면 서버가 인터넷을 통해 템플릿 파일을 보냅니다. 디렉토리 핸들러가 먼저 일치하므로 indexPage 핸들러가 호출되지 않습니다.

또한 "보기"폴더에 대해 이야기하지만 코드에는 "보기"(끝에 's'가 없음)라고 표시됩니다. 또 다른 간단한 이유가 될 수 있습니다.