6

我正在开发一个简单的待办事项应用程序。

我已经确定除了用户的待办事项列表之外的所有页面都可以安全地成为静态 html 页面。* 登录表格 * 新帐户表格 * 讨论 todo 应用程序的索引页面

我认为目前没有理由让这些成为 go 模板。

我的问题是如何(在 go 中,不使用 nginx 之类的东西)我可以设置一个静态 html 以最有效地在特定路线返回?

例如要在“/”处返回的 index.html

我知道我可以做类似的事情:

func GetNewAccount(res http.ResponseWriter, req *http.Request) {
        body, _ := ioutil.ReadFile("templates/register.html")
        fmt.Fprint(res, string(body))
}

或者

var register, _ = string(ioutil.ReadFile("templates/register.html"))
func GetNewAccount(res http.ResponseWriter, req *http.Request) {
        fmt.Fprint(res, register)
}

对我来说,这些似乎是更迂回的方式来做一些看似简单的事情。

4

2 回答 2

10

如果所有静态文件都在同一棵树下,则可以使用http.FileServer

http.Handle("/s/", http.StripPrefix("/s/", http.FileServer(http.Dir("/path/to/static/files/"))))

否则,将您想要的 html 文件预加载到地图中,然后根据请求的路径func init()为它们制作一个处理程序应该可以工作。fmt.Fprint

一个简单的静态文件处理程序示例:

func StaticFilesHandler(path, prefix, suffix string) func(w http.ResponseWriter, req *http.Request) {
    files, err := filepath.Glob(filepath.Join(path, "*", suffix))
    if err != nil {
        panic(err)
    }
    m := make(map[string][]byte, len(files))
    for _, fn := range files {
        if data, err := ioutil.ReadFile(fn); err == nil {
            fn = strings.TrimPrefix(fn, path)
            fn = strings.TrimSuffix(fn, suffix)
            m[fn] = data
        } else {
            panic(err)
        }
    }
    return func(w http.ResponseWriter, req *http.Request) {
        path := strings.TrimPrefix(req.URL.Path, prefix)
        if data := m[path]; data != nil {
            fmt.Fprint(w, data)
        } else {
            http.NotFound(w, req)
        }
    }
}

那么你可以像这样使用它:

http.Handle("/s/", StaticFilesHandler("/path/to/static/files", "/s/", ".html"))
于 2014-06-29T21:32:07.080 回答
-1

或者只是使用第三方库并执行以下操作:

iris.StaticServe("/path/to/static/files","/theroute") //gzip compression enabled

上面的代码片段是Iris的一部分

于 2016-05-23T13:33:05.247 回答