Das webapp Framework inkludiert die Django Template Engine in der Version 0.96. Dadurch ist es möglich mit dem Python Standard Modul os und dem template Modul der App Engine, Django ohne weitere Konfiguration zu nutzen. Die benötigten Templates speichert man innerhalb des Applikationsverzeichnisses in einem Verzeichnis templates, was auch in der Konfigurationsdatei (app.yaml) nicht extra definiert werden muss. Die Templates werden mit dem Verzeichnis zusammen und der Applikation gemeinsam hochladen. Das Verzeichnis ist nicht zwingend, die Templates können auch direkt im Applikationsverzeichnis liegen.
<!DOCTYPE HTML>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<div>{{ content }}</div>
</body>
</html>
Um Templates zu verwenden sind folgende import Aweisungen nötig.
import os from google.appengine.ext.webapp import template
Die Funktion template.render(file, values) hat als ersten Parameter ein HTML-Template und der zweite Parameter ist eine assoziative Liste mit Werten für das Template. Mit dem Response-Objekt sendet man den Output mittels response.out.write() als Antwort an den Browser. In diesem Moment werden die Platzhalter mit den passenden Werten aus der assoziative Liste gefüllt.
Werden Templates verwendet kann man sich einen Request Handler schreiben und weitere davon ableiten.
class TmplHandler(webapp.RequestHandler):
def getTemplate(self, templFile, templValues):
path = os.path.join(os.path.dirname(__file__), templFile)
return template.render(path, templValues)
class MainHandler(TmplHandler):
def get(self):
self.response.out.write(self.getTemplate('index.html', {}))
Innerhalb von Templates ist es möglich zusätzlich Entscheidungen in Form von Anweisungen zu treffen. Diese Anweisungen werden mit einer geschweiften Klammer, gefolgt von einem Prozentzeichen notiert, wobei Selektionen über if else möglich sind und Iterationen über for Schleifen zusätzlich zur Verfügung stehen.
{% if user_value %}
do something
{% else %}
something other
{% endif %}
{% ifequal path '/' %}
do something
{% endifequal %}
{% for item in items %}
{{item.name}}
{% endfor %}
Platzhalter können einen Filter haben, dieser wird mit einem senkrechten Strich an den Platzhalter gehängt.
{{ name|default:"no name" }}
{{ name|default_if_none:"no name" }}
{{ name|capfirst }}
{{ name|lower }}
{{ name|upper }}
{{ name|escape }}
{{ name|urlencode }}
{{ name|striptags }}
{{ name|cut: " " }}
{{ name|length }}
{{ name|wordcount }}
Es ist auch möglich ein Template in ein anderes Template zu inkludieren.
{% include "navigation.html" %}
Wenn man ein Template erstellt hat, können weitere Templates von diesem ableiten.
Definierte Blöcke innerhalb des Templates werden dann vom abgeleiteten Templates ersetzt.
<body>
{% block bodycontent %}
Hier der Inhalt des Templates.
{% endblock %}
</body>
{% extends "index.html" %}
{% block bodycontent %}
Ersetzter Inhalt des Templates.
{% endblock %}
Eine vollständige Dokumentation ist auf der Django Projekt Seite zu finden.
Django Projekt