Go, AppEngine: Как структурировать шаблоны для приложения - PullRequest
46 голосов
/ 06 марта 2012

Как люди обращаются с использованием шаблонов в своих приложениях AppEngine на основе Go?

В частности, я ищу структуру проекта, которая обеспечивает следующее:

  • Иерархический(каталог) структура шаблонов и частичных шаблонов
  • Позвольте мне использовать инструменты HTML / редакторы в моих шаблонах (это затрудняет встраивание текста шаблона в файлы xxx.go)
  • Автоматическая перезагрузка текста шаблонакогда на сервере разработки

Потенциальные камни преткновения:

  • template.ParseGlob () не будет проходить рекурсивно.
  • По соображениям производительности рекомендуетсяне загружать ваши шаблоны в виде необработанных текстовых файлов (потому что эти текстовые файлы находятся на разных серверах, чем исполняемый код).

Обратите внимание, что я не ищу учебник / примеры использования шаблонапакет.Это больше вопрос структуры приложения.При этом, если у вас есть код, который решает вышеуказанные проблемы, я хотел бы увидеть его.Заранее спасибо.

Ответы [ 2 ]

68 голосов
/ 06 марта 2012

Одна из моих любимых функций Go - возможность легко добавлять обработчики внутри пакетов.Это значительно упрощает процессы написания модульного кода.

Например:

Структура файла

|-- app.yaml
|-- app
|   +-- http.go
|-- templates
|   +-- base.html
+-- github.com
    +-- storeski
        +-- appengine
            |-- products
            |   |-- http.go
            |   +-- templates
            |       |-- list.html
            |       +-- detail.html 
            +-- account
                |-- http.go
                +-- templates
                    |-- overview.html
                    +-- notifications.html 

Каждый пакет имеет файл http.goкоторый становится владельцем URL-префикса.Например, пакет products в github.com/storeski/appengine/products будет иметь любой входящий URL, начиная с /products.

При таком модульном подходе выгодно хранить шаблоны в пакете products.Если вы хотите сохранить постоянный базовый шаблон для сайта, вы можете установить соглашение, в котором вы расширяете templates/base.html.

Пример

templates / base.html

<!DOCTYPE HTML>
<html>
  <head>
    <title>{{.Store.Title}}</title>
  </head>

  <body>
    <div id="content">
      {{template "content" .}}
    </div>
  </body>
</html>

github.com / storeski / appengine / products / templates / list.html

{{define "content"}}
  <h1> Products List </h1>
{{end}}

github.com/storeski/appengine/products/http.go

func init() {
  http.HandleFunc("/products", listHandler)
}

var listTmpl = template.Must(template.ParseFiles("templates/base.html",
  "github.com/storeski/appengine/products/templates/list.html"))

func listHandler(w http.ResponseWriter, r *http.Request) {

  tc := make(map[string]interface{})
  tc["Store"] = Store
  tc["Products"] = Products

  if err := listTmpl.Execute(w, tc); err != nil {
    http.Error(w, err.Error(), http.StatusInternalServerError)
  }
}

Этот подход очень интересен, поскольку делает совместное использование приложений / пакетов тривиальным.Если я напишу пакет, который обрабатывает аутентификацию, которая становится владельцем /auth url.Любой разработчик, который затем добавляет пакет в корневой каталог своего продукта, сразу же получает всю функциональность.Все, что им нужно сделать, это создать базовый шаблон (templates/base.html) и направить своих пользователей на /auth.

0 голосов
/ 06 марта 2012

Заранее извиняюсь, потому что этот пост - не то, что вы действительно ищете, и, возможно, вы уже слышали то, что я собираюсь сказать миллион раз.Это лучше, чем вообще никаких сообщений, так что вот так:

Go 1 выйдет очень скоро (через неделю или две).Я уверен, что App Engine скоро переключится на поддержку Go 1 через r60.Шаблонные corelibs (среди прочих libs) за это время играли с приличным количеством, так что довольно сложно найти популярный способ делать что-то, относящееся к самому себе из-за множества изменений, происходящих в языке.

Тем не менее, я видел довольно много людей, которые занимались такими разными способами, но очень немногие из них были специфичны для AppEngine, потому что большая часть работы, выполняемой в Go, соответствует современному языку (который долгое время не использовался).-совместимый с r60).Если вы хотите увидеть какой-то код, который люди использовали для подобных проектов, вам следует зайти на IRC и спросить.Шаблоны - популярная тема, и я использовал только базовую функциональность с ними - я никогда не касался наборов.IRC очень дружелюбный, и вы можете многому научиться там.Это определенно лучший ресурс, кроме документации на данный момент для языка.В случае, если вы еще не знаете, что канал IRC - это # ​​go-nuts во FreeNode.

Спасибо за чтение и удачи в разработке на App Engine.Я надеюсь, что обновления до Go 1 пройдут быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...