透過範本產生動態內容

這部分的 Python Guestbook 程式碼逐步操作說明如何使用 Jinja 範本產生動態網頁內容。

本頁面是多頁教學課程的一部分。如要從頭開始閱讀,並查看設定的操作說明,請前往建立留言板

內嵌在程式碼中的 HTML 不僅雜亂不堪,而且難以維護。較佳的處理方式是使用範本系統,將 HTML 存放在另一個檔案,並以特殊的語法指定資料出現在應用程式中的位置。現在有許多適用於 Python 的範本系統:EZTCheetahClearSilverQuixoteDjango 以及 Jinja2,而這些只是其中一部分。您可以自行選擇您要使用的範本引擎,同時使用範本引擎和您的應用程式程式碼。

為了您的方便,App Engine 提供 Django 和 Jinja2 這兩個範本引擎。

使用 Jinja2 範本

app.yaml 檔案列舉 jinja2 最新版本所需的函式庫。正式版應用程式應使用實際版本編號而非 version: latest

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

應用程式匯入 jinja2 並建立 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)

使用 MainPage 要求處理常式的 get 方法形成鍵/值組合的字典,並將其傳送至 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))

頁面會根據 index.html 範本呈現,並以接收的字典作為輸入內容。

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

JINJA_ENVIRONMENT.get_template(name) 方法使用範本檔案的名稱,並傳回一個範本物件。使用 template.render(template_values) 呼叫使用值字典,並傳回處理之後的文字。此範本使用 Jinja2 範本語法存取值並對值進行疊代作業,而且可以參照這些值的屬性。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Python 2 適用的 App Engine 標準環境