We can achieve what is known as "template inheritance" in other template engines using the {{block}} tag. A {{block}} is a replaceable fragment inside a template. Here's an example:
- {{define "Base"}}
<p>A header</p>
{{block body}}
File "/[...]/webapp/admin.py", line 23, in get | |
db.metadata.create_all() | |
File "/[...]/webapp/sqlalchemy/schema.py", line 2784, in create_all | |
tables=tables) | |
File "/[...]/webapp/sqlalchemy/engine/base.py", line 1487, in _run_visitor | |
conn._run_visitor(visitorcallable, element, **kwargs) | |
File "/[...]/webapp/sqlalchemy/engine/base.py", line 1130, in _run_visitor | |
**kwargs).traverse_single(element) | |
File "/[...]/webapp/sqlalchemy/sql/visitors.py", line 111, in traverse_single | |
return meth(obj, **kw) |
package foo | |
import ( | |
"net/http" | |
) | |
type MethodHandler map[string]http.Handler | |
func (h MethodHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { | |
if handler, ok := h[req.Method]; ok { |
package test | |
import ( | |
"net/http" | |
"github.com/gorilla/template/v0" | |
) | |
func helloHandler(w http.ResponseWriter, r *http.Request) { | |
set := template.Must(new(template.Set).Parse(`{{define "hello"}}Hello, world!{{end}}`)) |
// A base template with the layout skeleton. | |
// {{block}} actions define placeholders. | |
{{define "base"}} | |
<html> | |
<head> | |
<title>{{block "title"}}</title> | |
</head> | |
<body> | |
{{block "content"}} | |
</body> |
Node.js.....73,749 | |
Go.........286,483 |
{template Master} | |
<p>A header</p> | |
{call .body} | |
<p>A footer</p> | |
{end} | |
{template Hello} | |
{template body} | |
<p>Hello, world!</p> | |
{end} |
{{define "Master"}} | |
<p>A header</p> | |
{{template .body}} | |
<p>A footer</p> | |
{{end}} | |
{{define "Hello"}} | |
{{define "body"}} | |
Hello, world! | |
{{end}} |
This idea will be patented soon. Go away, Apple.
TL;DR: Django created template inheritance and people thought it was awesome and everybody copied it. Go doesn't have it, people cried. We got an idea to make people happy again, without changing text/template syntax.
import webapp2 | |
from webapp2_extras import local | |
_local = local.Local() | |
# The deferred handler instantiates webapp2.WSGIApplication in the module | |
# globals, so when it is imported it ends resetting app globals. | |
# To avoid this we duplicate the globals part of the WSGIApplication here, | |
# knowing that only we will instantiate it. |