我正在尝试查找here的go appengine教程,但我无法完成导入模板库的示例。这是我正在尝试的示例代码:
package hello
import (
"fmt"
"http"
"template"
)
func init() {
http.HandleFunc("/", root)
http.HandleFunc("/sign", sign)
}
func root(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, guestbookForm)
}
const guestbookForm = `
<html>
<body>
<form action="/sign" method="post">
<div><textarea name="content" rows="3" cols="60"></textarea></div>
<div><input type="submit" value="Sign Guestbook"></div>
</form>
</body>
</html>
`
func sign(w http.ResponseWriter, r *http.Request) {
err := signTemplate.Execute(w, r.FormValue("content"))
if err != nil {
http.Error(w, err.String(), http.StatusInternalServerError)
}
}
var signTemplate = template.MustParse(signTemplateHTML, nil)
const signTemplateHTML = `
<html>
<body>
<p>You wrote:</p>
<pre>{@|html}</pre>
</body>
</html>
`
我收到的错误是:
Compile error:
/home/habitue/Programming/GoExamples/hello/hello.go:36: undefined: template.MustParse
我的app.yaml是这样的:
application: helloworld
version: 1
runtime: go
api_version: 3
handlers:
- url: /.*
script: _go_app
我已经尝试修改dev_appserver.py EXTRA_PATHS
列表以包含Go库的系统版本,因为我注意到appengine lib文件夹没有包含模板库,但无济于事。这是我当前的EXTRA_PATHS
,我的更改是最后两个条目:
EXTRA_PATHS = [
DIR_PATH
,os.path.join(DIR_PATH, 'lib', 'antlr3')
,os.path.join(DIR_PATH, 'lib', 'django_0_96')
,os.path.join(DIR_PATH, 'lib', 'fancy_urllib')
,os.path.join(DIR_PATH, 'lib', 'ipaddr')
,os.path.join(DIR_PATH, 'lib', 'protorpc')
,os.path.join(DIR_PATH, 'lib', 'webob')
,os.path.join(DIR_PATH, 'lib', 'yaml', 'lib')
,os.path.join(DIR_PATH, 'lib', 'simplejson')
,os.path.join(DIR_PATH, 'lib', 'google.appengine._internal.graphy')
,os.path.join('usr', 'lib', 'go', 'lib')
,os.path.join('usr', 'lib', 'go', 'pkg', 'linux_amd64')
]
此时,我不确定如何继续。我似乎无法在网上找到提到类似问题的任何地方。我正在使用64位linux版本的appengine Go SDK,我的操作系统是Arch Linux,如果有任何帮助的话。
答案 0 :(得分:3)
现在看起来或多或少会像这样:
package main
import (
"fmt"
"http"
"template"
)
func init() {
http.HandleFunc("/", root)
http.HandleFunc("/sign", sign)
}
func root(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, guestbookForm)
}
const guestbookForm = `
<html>
<body>
<form action="/sign" method="post">
<div><textarea name="content" rows="3" cols="60"></textarea></div>
<div><input type="submit" value="Sign Guestbook"></div>
</form>
</body>
</html>
`
func sign(w http.ResponseWriter, r *http.Request) {
err := signTemplate.Execute(w, r.FormValue("content"))
if err != nil {
http.Error(w, err.String(), http.StatusInternalServerError)
}
}
var signTemplate = template.Must(template.New("SignIn").Parse(signTemplateHTML))
const signTemplateHTML = `
<html>
<body>
<p>You wrote:</p>
<pre>{{.|html}}</pre>
</body>
</html>`
请注意调用初始化var signTemplate
和signTemplateHTML变量{{.|html}}
中的模板参数而不是{@|html}
的区别。
答案 1 :(得分:1)
Go template package最近被重写了。尝试导入"old/template"
。
本周包含一些包裹重新洗牌。 http的用户和 模板包可能会受到影响。
本周用exp / template替换模板包。该 原始模板包仍可用作旧/模板。该 旧的/模板包已弃用,将在某些时候删除 在将来。 Go树已更新为使用新模板 包。我们鼓励旧模板包的用户切换到 新的那一个。使用模板或exp /模板的代码需要 将其导入行分别更改为“旧/模板”或“模板”。