Сервер разработки Appengine Go не может найти пакет шаблонов - PullRequest
2 голосов
/ 15 октября 2011

Я пытаюсь найти обучающее руководство по go appengine здесь , но я не могу завершить пример импорта библиотеки шаблонов.Это пример кода, который я пытаюсь:

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

Я получаю ошибку:

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

Мое приложение.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-версию приложения Go SDK, и моя ОС - Arch Linux, если это поможет.

Ответы [ 2 ]

3 голосов
/ 15 октября 2011

Образец устарел, начиная с обновления SDK 1.5.5.

Теперь он должен выглядеть примерно так:

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

Обратите внимание на разницу в инициализации вызова var signTemplate и параметре шаблона в переменной signTemplateHTML, {{.|html}} вместо {@|html}.

1 голос
/ 15 октября 2011

Шаблон пакета Go был недавно переписан. Попробуйте импортировать "old/template".

2011-08-17 (база для R60)

Этот еженедельник содержит некоторые перестановки пакетов. Пользователи http и пакеты шаблонов могут быть затронуты.

Этот еженедельник заменяет пакет шаблонов на exp / template. Оригинальный пакет шаблонов по-прежнему доступен как old / template. старый / шаблонный пакет устарел и будет удален в какой-то момент в будущем. Дерево Go было обновлено для использования нового шаблона пакет. Мы рекомендуем пользователям старого пакета шаблонов перейти на новый. Код, который использует шаблон или exp / template, должен измените строки импорта на «old / template» или «template» соответственно.

...