Подтвердить что ты не робот

Go, AppEngine: как структурировать шаблоны для приложения

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

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

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

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

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

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

4b9b3361

Ответ 1

Одна из моих любимых функций 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.

Пример

Шаблоны/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)
  }
}

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

Ответ 2

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

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

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

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