Dynamische Inhalte aus Vorlagen generieren


In diesem Teil der Anleitung zum Python-Gästebuch-Code erfahren Sie, wie dynamische Webinhalte mit Jinja-Vorlagen erzeugt werden.

Diese Seite ist Teil einer mehrseitigen Anleitung. Wenn Sie die Anleitung von Anfang an durchgehen und eine Anleitung zur Einrichtung erhalten möchten, rufen Sie Gästebuchanwendungen erstellen auf.

In Code eingebettetes HTML ist unübersichtlich und schwierig zu pflegen. Daher ist die Verwendung eines Vorlagensystems die bessere Lösung. Hierbei befindet sich das HTML in einer separaten Datei mit einer speziellen Syntax, um anzugeben, an welcher Stelle die Daten der Anwendung angezeigt werden. Für Python stehen viele Vorlagensysteme zur Verfügung, unter anderem: EZT, Cheetah, ClearSilver, Quixote, Django, und Jinja2. Sie können die Vorlagen-Engine Ihrer Wahl verwenden, indem Sie sie mit Ihrem Anwendungscode bündeln.

Um Ihnen die Arbeit zu erleichtern, enthält App Engine die Vorlagen-Engines Django und Jinja2.

Jinja2-Vorlagen verwenden

In der app.yaml-Datei wird die neueste Version von jinja2 als erforderliche Bibliothek aufgelistet. In Produktionsanwendungen sollte eine konkrete Versionsnummer statt version: latest verwendet werden.

libraries:
- name: webapp2
  version: latest
- name: jinja2
  version: latest

Die Anwendung importiert jinja2 und erstellt ein jinja2.Environment-Objekt.

import os
import urllib

from google.appengine.api import users
from google.appengine.ext import ndb

import jinja2
import webapp2

JINJA_ENVIRONMENT = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
    extensions=['jinja2.ext.autoescape'],
    autoescape=True)

Die get-Methode für den Request-Handler MainPage bildet ein Dictionary aus Schlüssel/Wert-Paaren und übergibt es an template.render.

class MainPage(webapp2.RequestHandler):

    def get(self):
        guestbook_name = self.request.get('guestbook_name',
                                          DEFAULT_GUESTBOOK_NAME)
        greetings_query = Greeting.query(
            ancestor=guestbook_key(guestbook_name)).order(-Greeting.date)
        greetings = greetings_query.fetch(10)

        user = users.get_current_user()
        if user:
            url = users.create_logout_url(self.request.uri)
            url_linktext = 'Logout'
        else:
            url = users.create_login_url(self.request.uri)
            url_linktext = 'Login'

        template_values = {
            'user': user,
            'greetings': greetings,
            'guestbook_name': urllib.quote_plus(guestbook_name),
            'url': url,
            'url_linktext': url_linktext,
        }

        template = JINJA_ENVIRONMENT.get_template('index.html')
        self.response.write(template.render(template_values))

Die Seite wird gemäß der Vorlage index.html gerendert, die das Dictionary als Eingabe empfängt.

{% for greeting in greetings %}
<div class="row">
  {% if greeting.author %}
    <b>{{ greeting.author.email }}
      {% if user and user.user_id() == greeting.author.identity %}
        (You)
      {% endif %}
    </b> wrote:
  {% else %}
    An anonymous person wrote:
  {% endif %}
  <blockquote>{{ greeting.content }}</blockquote>
</div>
{% endfor %}

Die Methode JINJA_ENVIRONMENT.get_template(name) übernimmt den Namen einer Vorlagendatei und gibt ein Vorlagenobjekt zurück. Der Aufruf template.render(template_values) verwendet ein Dictionary mit Werten und gibt den gerenderten Text zurück. Bei der Vorlage wird die Jinja2-Vorlagensyntax verwendet, um auf die Werte zuzugreifen und diese zu durchlaufen. Außerdem kann auf die Attribute dieser Werte Bezug genommen werden.