去,AppEngine:如何构build模板的应用程序

人们如何在基于Go的AppEngine应用程序中处理模板的使用?

具体而言,我正在寻找一个项目结构,提供以下内容:

  • 模板和部分模板的分层(目录)结构
  • 允许我在我的模板上使用HTML工具/编辑器(在xxx.go文件中embedded模板文本使得这很困难)
  • 在开发服务器上时,自动重新加载模板文本

潜在的绊脚石是:

  • template.ParseGlob()不会recursion地遍历。
  • 出于性能方面的原因,build议不要以原始文本file upload模板(因为这些文本文件驻留在不同的服务器上,而不是执行代码)。

请注意,我不在寻找一个教程/使用模板包的例子。 这更多的是一个应用程序结构的问题。 这就是说,如果你有解决上述问题的代码,我很乐意看到它。 提前致谢。

Go最喜欢的function之一是能够轻松地在包内添加处理程序。 这大大简化了编写代码的过程。

例如:

文件结构

|-- app.yaml |-- app | +-- http.go |-- templates | +-- base.html +-- github.com +-- storeski +-- appengine |-- products | |-- http.go | +-- templates | |-- list.html | +-- detail.html +-- account |-- http.go +-- templates |-- overview.html +-- notifications.html 

每个软件包都有一个http.go文件,它拥有一个url前缀的所有权。 例如, github.com/storeski/appengine/products /products github.com/storeski/appengine/products /products github.com/storeski/appengine/products /products下的products包将拥有以/products开头的任何入站url。

使用这种模块化方法,将模板存储在products包中是有益的。 如果您想为该网站维护一个一致的基本模板,则可以在扩展templates/base.html地方build立一个约定。

模板/ base.html文件

 <!DOCTYPE HTML> <html> <head> <title>{{.Store.Title}}</title> </head> <body> <div id="content"> {{template "content" .}} </div> </body> </html> 

github.com/storeski/appengine/products/templates/list.html

 {{define "content"}} <h1> Products List </h1> {{end}} 

github.com/storeski/appengine/products/http.go

 func init() { http.HandleFunc("/products", listHandler) } var listTmpl = template.Must(template.ParseFiles("templates/base.html", "github.com/storeski/appengine/products/templates/list.html")) func listHandler(w http.ResponseWriter, r *http.Request) { tc := make(map[string]interface{}) tc["Store"] = Store tc["Products"] = Products if err := listTmpl.Execute(w, tc); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } 

这种方法是非常令人兴奋的,因为它使应用程序/包的分享变得微不足道。 如果我编写一个处理身份validation的程序包,它将获得/auth url的所有权。 然后,任何开发人员立即将软件包添加到他们的产品根目录中,都具有所有的function。 他们所要做的就是创build一个基本模板( templates/base.html )并将其用户指向/auth

事先道歉,因为这个职位不是你真正想要的,你可能已经听到了我要说一百万次。 虽然比没有post好,所以在这里:

Go 1将很快发布(在一两周内)。 我认为App Engine将会在不久之后转向支持Go 1。 模板corelibs(在其他libs中)在那个时候玩得相当不错,所以find与自己相关的stream行的方式是很麻烦的,因为这个语言有很多变化。

这就是说,我看到不less人正在处理这种不同的方式,但是他们中很less有人是AppEngine,因为在Go中完成的大部分工作都与语言保持同步(这一直是非语言的与r60兼容)。 如果你想看到一些人们用于类似项目的代码,你应该跳上IRC并询问。 模板是一个stream行的话题,我只用了很多基本的function – 我从来没有碰过套。 IRC是超级友好的,你可以在那里学到很多东西。 除了现在的文档外,这绝对是最好的资源。 如果你还不知道IRC频道是在FreeNode上进行的话。

感谢您阅读并在App Engine上开发好运。 我希望Go 1的更新能够快速进行。