【问题标题】:Appengine Go development server can't find the template packageAppengine Go 开发服务器找不到模板包
【发布时间】:2011-12-08 03:57:48
【问题描述】:

我正在尝试执行找到 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,如果有帮助的话。

【问题讨论】:

标签: google-app-engine templates go


【解决方案1】:

从 SDK 1.5.5 更新开始,示例已过时。

现在它应该或多或少像这样:

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} 的区别。

【讨论】:

    【解决方案2】:

    Go template package 最近已被重写。尝试导入"old/template"

    2011-08-17 (base for r60)

    这周包含一些包重新洗牌。 http的用户和 模板包可能会受到影响。

    本周将模板包替换为 exp/template。这 原始模板包仍可作为旧/模板使用。这 old/template 包已弃用,将在某个时候被删除 将来。 Go 树已更新为使用新模板 包裹。我们鼓励旧模板包的用户切换到 新的那一个。使用模板或 exp/template 的代码需要 将其导入行分别更改为“old/template”或“template”。

    【讨论】:

    • 然而,尝试使用新的模板包可能是个好主意,如下面的答案所示。所以选项是:a)导入“旧/模板”或b)导入“模板”(但忽略过时的教程并使用以下SDK 1.5.5的答案)。
    猜你喜欢
    • 1970-01-01
    • 2021-01-15
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    相关资源
    最近更新 更多