tutorial standard prices google flexible español engine appengine app google-app-engine go template-engine mustache

google app engine - standard - ¿Es posible tener plantillas anidadas en Go usando la biblioteca estándar?(Motor de aplicaciones de Google)



google app engine tutorial español (4)

He estado volviendo a esta respuesta durante días, finalmente mordí la bala y escribí una pequeña capa de abstracción / preprocesador para esto. Básicamente

  • Agrega la palabra clave ''extends'' a las plantillas.
  • Permite anular las llamadas ''definir'' (por lo tanto, son posibles los valores predeterminados para la reglamentación)
  • Permite llamadas de ''plantilla'' no definidas, solo dan una cadena vacía
  • Establece el valor predeterminado de. en ''plantilla'' llama a. del padre

https://github.com/daemonl/go_sweetpl

¿Cómo puedo obtener plantillas anidadas como Jinja en el tiempo de ejecución de Python? TBC, lo que quiero decir es ¿cómo puedo heredar un conjunto de plantillas de una plantilla base, solo archivar en bloques de las plantillas base, como lo hace Jinja / django-templates? ¿Es posible usar solo html/template en la biblioteca estándar?

Si eso no es una posibilidad, ¿cuáles son mis alternativas? El bigote parece ser una opción, pero ¿me estaría perdiendo esas agradables características sutiles de html/template como el escape sensible al contexto, etc.? ¿Qué otras alternativas hay?

(Medio ambiente: Google App Engin, Go runtime v1, Dev - Mac OSx lion)

Gracias por leer.


Sí, es posible. Un html.Template es en realidad un conjunto de archivos de plantilla. Si ejecuta un bloque definido en este conjunto, tiene acceso a todos los otros bloques definidos en este conjunto.

Si crea un mapa de dichos conjuntos de plantillas por su cuenta, tiene básicamente la misma flexibilidad que ofrece Jinja / Django. La única diferencia es que el paquete html/template no tiene acceso directo al sistema de archivos, por lo que debe analizar y componer las plantillas por su cuenta.

Considere el siguiente ejemplo con dos páginas diferentes ("index.html" y "other.html") que ambas heredan de "base.html":

// Content of base.html: {{define "base"}}<html> <head>{{template "head" .}}</head> <body>{{template "body" .}}</body> </html>{{end}} // Content of index.html: {{define "head"}}<title>index</title>{{end}} {{define "body"}}index{{end}} // Content of other.html: {{define "head"}}<title>other</title>{{end}} {{define "body"}}other{{end}}

Y el siguiente mapa de conjuntos de plantillas:

tmpl := make(map[string]*template.Template) tmpl["index.html"] = template.Must(template.ParseFiles("index.html", "base.html")) tmpl["other.html"] = template.Must(template.ParseFiles("other.html", "base.html"))

Ahora puede renderizar su página "index.html" llamando

tmpl["index.html"].Execute("base", data)

y puede presentar su página "other.html" llamando

tmpl["other.html"].Execute("base", data)

Con algunos trucos (por ejemplo, una convención de nomenclatura consistente de sus archivos de plantilla), incluso es posible generar el mapa tmpl automáticamente.


Use Pongo , que es un superconjunto de Go Templates que admite las etiquetas {{extends}} y {{block}} para la herencia de plantillas, al igual que Django.


tenga en cuenta que cuando ejecuta su plantilla base, debe pasar los valores a las plantillas secundarias, aquí simplemente paso ".", para que todo se transmita.

la plantilla uno muestra {{.}}

{{define "base"}} <html> <div class="container"> {{.}} {{template "content" .}} </div> </body> </html> {{end}}

la plantilla dos muestra {{.domains}} que se pasa al padre.

{{define "content"}} {{.domains}} {{end}}

Tenga en cuenta que si usáramos {{template "content".}} En lugar de {{template "content".}}, No podríamos acceder a .domains desde la plantilla de contenido.

DomainsData := make(map[string]interface{}) DomainsData["domains"] = domains.Domains if err := groupsTemplate.ExecuteTemplate(w, "base", DomainsData); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) }