Golang 模板不渲染 html

标签 go rendering go-templates

我在我的网络根目录中创建了一个名为“views”的子文件夹。在 View 文件夹中,我有一个包含 css 和 js 文件的静态文件夹。 当我在网络根目录中有 html 文件时,将呈现 html 页面。但是,当放置在 views 文件夹中时,它们不会呈现。我正在使用 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 文件:在我在 signin.html 文件中引用的 index.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 文件:

    {{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 的参数。

最佳答案

我相信您需要做的就是删除这一行:

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

适合我。尽管您也需要稍微清理一下 html - 我看到至少缺少一个 </div> .

模板在服务器上处理,不需要通过互联网提供。同时,此路由条目与以下路由条目 (indexPage) 冲突,后者为同一路由条目 ("/") 定义了另一个处理程序。所以当你在浏览器中打开它时,服务器只是通过互联网发送模板文件。虽然永远不会调用 indexPage 处理程序,因为首先匹配目录处理程序。

你也在谈论“views”文件夹,但你的代码说“view”(末尾没有's')。可能是另一个简单的原因。

关于Golang 模板不渲染 html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41750534/

相关文章:

memory-management - 为什么我的 Go 程序内存波动这么大?

javascript - 为什么这个循环在将每个结果添加到列表之前要等待完成?带 JSFiddle

go - golang 模板中字符串 slice 的范围

swift - 触摸屏幕时 SceneKit 偶尔出现卡顿

go - 如何将数据添加到在 Go 中作为参数的接口(interface)?

go - 如何避免由条件引起的换行?

go - 尝试在 golang 中读取 gzip 文件时出错

go - Gin 错误 : listen tcp: lookup addr on : no such host

go - 如果 go 模块坏了怎么办

javascript - 为什么会抛出这个 JS 错误?