お気に入り | 日本語 | ログイン

テンプレートの使用

コードに HTML を埋め込むのは、面倒な上に管理が困難です。このような場合は、テンプレート システムを使用すると便利です。テンプレート システムでは、アプリケーションのデータが出現する場所を示す特殊な構文を使って、HTML を別ファイルとして維持します。Python 用のテンプレート システムは数多くありますが、EZTCheetahClearSilverQuixoteDjango などが代表的です。任意のテンプレート エンジンを選び、アプリケーション コードにバンドルして使用してください。

簡便な方法として、webapp モジュールでは、Django のテンプレート エンジンが用意されています。これは SDK にも含まれており、App Engine の一部でもあるため、バンドルしなくても使用できます。

Django テンプレートの使用

冒頭の helloworld/helloworld.py に次の import 文を追加します。

import os
from google.appengine.ext.webapp import template

MainPage ハンドラを、次のようなコードで置き換えます。

class MainPage(webapp.RequestHandler):
  def get(self):
    greetings_query = Greeting.all().order('-date')
    greetings = greetings_query.fetch(10)

    if users.get_current_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 = {
      'greetings': greetings,
      'url': url,
      'url_linktext': url_linktext,
      }

    path = os.path.join(os.path.dirname(__file__), 'index.html')
    self.response.out.write(template.render(path, template_values))

helloworld ディレクトリで、index.html という名前のファイルを新しく作成し、次のコンテンツを入れます。

<html>
  <body>
    {% for greeting in greetings %}
      {% if greeting.author %}
        <b>{{ greeting.author.nickname }}</b> wrote:
      {% else %}
       An anonymous person wrote:
      {% endif %}
      <blockquote>{{ greeting.content|escape }}</blockquote>
    {% endfor %}

    <form action="/sign" method="post">
      <div><textarea name="content" rows="3" cols="60"></textarea></div>
      <div><input type="submit" value="Sign Guestbook"></div>
    </form>

    <a href="{{ url }}">{{ url_linktext }}</a>

  </body>
</html>

ページをリロードし、出力を確認します。

template.render(path, template_values) は、テンプレート ファイルまでのパスと、値のディクショナリを取り、レンダリングしたテキストを返します。テンプレートは Django のテンプレート構文を使用して値にアクセスおよび反復し、これらの値のプロパティを参照することができます。多くの場合、データストアのモデル オブジェクトを値として直接渡すことにより、テンプレートからそのプロパティにアクセスすることができます。

ヒント: App Engine アプリケーションでは、プロジェクト、ライブラリ モジュール、その他のファイルでアップロードされたすべてのファイルに読み取り専用でアクセスします。現在の作業ディレクトリはアプリケーションのルート ディレクトリになっているため、index.html へのパスは単に "index.html" となります。

Django テンプレート エンジンに関する詳しい情報は、Django 0.96 テンプレート ドキュメントをご覧ください。

次のステップ

各 Web アプリケーションは、テンプレートまたは何らかのシステムにより、コードで動的に生成した HTML を返します。ほとんどの Web アプリケーションは、画像や CSS スタイルシート、JavaScript ファイルなどの静的コンテンツに対応する必要があります。効率性のため、App Engine では、静的ファイルを、アプリケーション ソースやデータ ファイルとは分けて扱います。App Engine の静的ファイル機能を使用して、アプリケーション用の CSS スタイルシートを供給することができます。

静的ファイルの使用に進みます。