webapp でのテンプレートの利用方法 - 変数、コレクションの利用
webapp のテンプレートというのが、なぜ登場して、単純な形ではどのように使えるのか「webapp でのテンプレートの利用方法」で示しました。 ここではそれをもう一歩発展させます。
さて、テンプレート index.html を次のように書き換えます。
<html>
<body>
<h1>Hello, {{first_name}}!</h1>
</body>
</html>
Hello, template という文字が、Hello, {{first_name}} というように書き換わっています。 実はここにプログラムから値を渡してはめ込むことができるのです。
helloworld.py を次のように書き換えます。
import os
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from google.appengine.ext.webapp.util import run_wsgi_app
class MyPage(webapp.RequestHandler):
def get(self):
template_values = {
'first_name': 'Keisuke'
}
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))
application = webapp.WSGIApplication([('/', MyPage)], debug=True)
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()
以前と変わったところは、たった一箇所、ここです。
template_values = {
'first_name': 'Keisuke'
}
template_values という名前のディクショナリは、もともと空にしていたのですが、そこに値を入れました。
template.render メソッドはテンプレート(のパス)とディクショナリを受け取り、そのテンプレートにディクショナリのデータを当てはめるのです。
その結果、{{キー名}} の部分が置き換わり、最終的に次のようになります。
テンプレートでのコレクションの処理
もう少し発展させます。次のように template_values 内にコレクション(ここではタプル)を含ませ、それらをテンプレート内で展開することができることを示します。
class MyPage(webapp.RequestHandler):
def get(self):
template_values = {
'first_name': 'Keisuke',
'pets':('dog','cat','horse')
}
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))
pets という名前のコレクションがあり、そこに値が三つ (dog, cat, horse) 含まれています。 そのコレクション内の値をイテレートするために、for ... in コレクション が使えます。
具体的には次のようになります。
<html>
<body>
<h1>Hello, {{first_name}}!</h1>
{% for pet in pets %}
<p>{{pet}}</p>
{% endfor %}
</body>
</html>
ポイントはここです。
{% for pet in pets %}
<p>{{pet}}</p>
{% endfor %}
コレクション pets に対して for - endfor にて繰り返し処理をしています。
この結果、コレクション内の要素数だけ繰り返し処理され、次のようになります。
生成された HTML を確認すると、次のようになります。
テンプレートでは繰り返し処理だけでなく、この他に条件分岐などもできます。 こうしてテンプレートでその表示方法 (View) を決めることが可能となります。
ちなみに、webapp は Django のテンプレートエンジンを利用しています。Django については、Python 入門の Django の解説ページをご覧ください。