Membuat Konten Dinamis dari Template


Bagian dari panduan kode Buku Tamu Python ini menunjukkan cara menggunakan template Jinja untuk menghasilkan konten web dinamis.

Halaman ini adalah bagian dari tutorial multi-halaman. Untuk memulai dari awal dan melihat petunjuk penyiapan, buka Membuat Buku Tamu.

HTML yang disematkan dalam kode berantakan dan sulit dikelola. Lebih baik menggunakan sistem template, di mana HTML disimpan dalam file terpisah dengan sintaksis khusus untuk menunjukkan tempat munculnya data dari aplikasi. Ada banyak sistem template untuk Python: EZT, Cheetah, ClearSilver, Quixote, Django, dan Jinja2 hanyalah beberapa di antaranya. Anda dapat menggunakan mesin template pilihan dengan memaketkannya bersama kode aplikasi Anda.

Untuk memudahkan Anda, App Engine menyertakan mesin template Django dan Jinja2.

Menggunakan Template Jinja2

File app.yaml mencantumkan versi terbaru jinja2 sebagai library yang diperlukan. Aplikasi produksi harus menggunakan nomor versi sebenarnya, bukan version: latest.

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

Aplikasi ini mengimpor jinja2 dan membuat objek jinja2.Environment.

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)

Metode get untuk pengendali permintaan MainPage membentuk kamus key-value pair dan meneruskannya ke 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))

Halaman dirender sesuai dengan template index.html, yang menerima kamus sebagai input.

{% 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 %}

Metode JINJA_ENVIRONMENT.get_template(name) mengambil nama file template dan menampilkan objek template. Panggilan template.render(template_values) menggunakan kamus nilai, dan menampilkan teks yang dirender. Template ini menggunakan sintaksis template Jinja2 untuk mengakses dan melakukan iterasi pada nilai, serta dapat merujuk ke properti nilai tersebut.