使用标准库可以在Go中嵌套模板吗?Google App Engine

问题描述

是的,有可能。A html.Template实际上是一组模板文件。如果执行该集中定义的块,则该块有权访问该集中定义的所有其他块。

如果您自己创建此类模板集的映射,则基本上具有Jinja / Django提供的灵活性。唯一的区别是html / template包无法直接访问文件系统,因此您必须自己解析和编写模板。

考虑下面的示例,其中有两个不同的页面(“ index.html”和“ other.html”)都继承自“ base.html”:

// Content of base.html:
{{define "base"}}<html>
  <head>{{template "head" .}}</head>
  <body>{{template "body" .}}</body>
</html>{{end}}

// Content of index.html:
{{define "head"}}<title>index</title>{{end}}
{{define "body"}}index{{end}}

// Content of other.html:
{{define "head"}}<title>other</title>{{end}}
{{define "body"}}other{{end}}

以及以下模板集图:

tmpl := make(map[string]*template.Template)
tmpl["index.html"] = template.Must(template.ParseFiles("index.html", "base.html"))
tmpl["other.html"] = template.Must(template.ParseFiles("other.html", "base.html"))

您现在可以通过调用来呈现“ index.html”页面

tmpl["index.html"].Execute("base", data)

您可以通过调用来呈现“ other.html”页面

tmpl["other.html"].Execute("base", data)

通过一些技巧(例如,模板文件的命名约定一致),甚至可以tmpl自动生成地图。

解决方法

我如何在python运行时中获得类似于Jinja的嵌套模板。TBC的意思是我如何从基本模板继承一堆模板,就像在Jinja / django-
templates中那样,将基本模板中的文件归档。是否可以仅html/template在标准库中使用。

如果那是不可能的,我有什么选择。胡子似乎是一种选择,但是我会不会错过那些html/template诸如上下文相关的转义等漂亮的微妙功能?还有什么其他选择?

(环境:Google App Engin,Go runtime v1,Dev-Mac OSx lion)

谢谢阅读。