duaner1634
duaner1634
2011-10-15 00:40
浏览 59
已采纳

Appengine Go开发服务器找不到模板包

I'm attempting to do the go appengine tutorial found here, but I can't complete the example that imports the template library. This is the example code I am trying:

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>
`

The error I am receiving is:

Compile error:
    /home/habitue/Programming/GoExamples/hello/hello.go:36: undefined: template.MustParse

My app.yaml is this:

application: helloworld
version: 1
runtime: go
api_version: 3

handlers:
- url: /.*
  script: _go_app

I've tried modifying the dev_appserver.py EXTRA_PATHS list to include the system version of Go's libraries, since I noticed the appengine lib folder did not include a template library, but to no avail. Here is my current EXTRA_PATHSwith my changes being the last two entries:

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')
]

At this point, I'm not really sure how to proceed. I can't seem to find anywhere online that mentions a similar problem. I'm using the 64bit linux version of the appengine Go SDK, and my OS is Arch Linux, if that is any help.

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • dongzhan1878
    dongzhan1878 2011-10-15 19:06
    已采纳

    The sample is outdated starting with the SDK 1.5.5 update.

    Now it should look more or less like this:

    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>`
    

    Notice the difference in call initializing var signTemplate and the template parameter in the signTemplateHTML variable, {{.|html}} instead of {@|html}.

    点赞 评论
  • dtp87205
    dtp87205 2011-10-15 02:34

    The Go template package has recently been rewritten. Try importing "old/template".

    2011-08-17 (base for r60)

    This weekly contains some package re-shuffling. Users of the http and template packages may be affected.

    This weekly replaces the template package with exp/template. The original template package is still available as old/template. The old/template package is deprecated and will be removed at some point in the future. The Go tree has been updated to use the new template package. We encourage users of the old template package to switch to the new one. Code that uses template or exp/template will need to change its import lines to "old/template" or "template", respectively.

    点赞 评论

相关推荐