Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine Go,AppEngine:如何为应用程序构造模板_Google App Engine_Go - Fatal编程技术网

Google app engine Go,AppEngine:如何为应用程序构造模板

Google app engine Go,AppEngine:如何为应用程序构造模板,google-app-engine,go,Google App Engine,Go,人们如何在基于Go的AppEngine应用程序中处理模板的使用 具体而言,我正在寻找一个项目结构,该结构提供以下内容: 模板和部分模板的层次(目录)结构 允许我在模板上使用HTML工具/编辑器(在xxx.go文件中嵌入模板文本会使这变得很困难) 在dev服务器上自动重新加载模板文本 潜在的绊脚石包括: ParseGlob()将不会递归遍历 出于性能原因,建议不要将模板作为原始文本文件上载(因为这些文本文件驻留在与执行代码不同的服务器上) 请注意,我不是在寻找使用模板包的教程/示例。这更多

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

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

  • 模板和部分模板的层次(目录)结构
  • 允许我在模板上使用HTML工具/编辑器(在xxx.go文件中嵌入模板文本会使这变得很困难)
  • 在dev服务器上自动重新加载模板文本
潜在的绊脚石包括:

  • ParseGlob()将不会递归遍历
  • 出于性能原因,建议不要将模板作为原始文本文件上载(因为这些文本文件驻留在与执行代码不同的服务器上)

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

事先道歉,因为这篇文章不是你真正想要的,你可能已经听过我要说的一百万遍了。但总比没有帖子好,所以这里是:

Go 1将很快发布(一两周后)。我确信应用程序引擎将在相对较短的时间内转向支持Go 1而非r60。模板corelibs(在其他libs中)在那段时间里得到了相当多的使用,因此,由于语言中发生了许多变化,要找到与自己相关的流行方式有点混乱

话虽如此,我见过不少人以不同的方式处理这个问题,但很少有人是针对特定于外观的,因为在Go中完成的大部分工作都与语言保持最新(该语言长期以来与r60不兼容)。如果你想看到人们在类似项目中使用的一些代码,你应该跳上IRC并询问。模板是一个很受欢迎的话题,我只使用过它们的基本功能——我从未接触过集合。IRC非常友好,你可以在那里学到很多东西。这绝对是目前除了文档之外最好的语言资源。如果你还不知道IRC频道在FreeNode上疯了


感谢阅读,祝你在appengine上开发好运。我希望更新能够迅速进行。

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

例如:

文件结构

|-- 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
包将拥有任何以
/products
开头的入站url

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

示例

|-- 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 
模板/base.html


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

谢谢。基于Go1的SDK的测试版已经发布了:新的模板包已经相对稳定了几个月,所以我希望已经对这些问题进行了一些思考。即使答案不是针对AppEngine的,我也会很高兴。但我会接受你的建议并在IRC上询问。我会回来报告的。IRC并不是很有成效,但邮件列表上有这样的讨论:布局不错,凯尔。在包含内容模板时,您可能应该添加点(.),例如
{{{template“content.}}
。否则,您的tc将无法在products/templates/list.htmlTanks@alex中访问--我已编辑了答案,以包含您的建议。非常好,Kyle。您建议如何使用此布局处理模型?我的意思是在http.go中声明类型,或者创建一个model.go文件?。提前感谢。您好@PatrickLinskey,您的
app.yaml
文件不应包含
模板
目录。App Engine将
App.yaml
文件中列出的目录视为静态资源,但任何未在
App.yaml
文件中列出的目录都可以从代码中访问。我希望这会有所帮助。@425nesp,是的,只需创建另一个
var detailTmpl=…
list.html
替换为
detail.html
,并在同一
http.go
文件中创建一个
func detailHandler(…
)。
{{define "content"}}
  <h1> Products List </h1>
{{end}}
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)
  }
}