我正在开发一个简单的todo应用程序。
我已经确定除了用户的待办事项列表之外的所有页面都可以安全地成为静态html页面。 * 登录表格 *新帐户表格 *关于todo app的索引页面
我认为这些目前没有理由去模板。
我的问题是如何(在内部,不使用像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)
}
对我来说,这些似乎更为迂回的做法,看似简单。
答案 0 :(得分:7)
如果所有静态文件位于同一树下,则可以使用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"))
答案 1 :(得分:-1)
或者只是使用第三方库并执行以下操作:
iris.StaticServe("/path/to/static/files","/theroute") //gzip compression enabled
上面的代码段是Iris
的一部分