libro
www.tuyano.com
PythonによるGoogle App Engine(GAE)プログラミング入門

テンプレートとフォームの利用 (3/7)

作成:2010-01-03 11:17
更新:2010-12-13 08:34

■pythonソースコードの修正

では、python側のソースコードを修正しましょう。スクリプトファイル(.py拡張子のファイル)を開き、以下に上げたリストのようにソースコードを書き換えてください。

ここでは、いくつかの新しいものが使われています。まず、冒頭で読み込むライブラリに、以下の2つが追加されていますね。
import os
from google.appengine.ext.webapp import template
「os」は、osの機能を利用するもので、ここではファイルのパスを取得するのに使っています。もう1つのgoogle.appengine.ext.webappにある「template」が、テンプレートの機能です。これを読み込むことで、テンプレートの機能が使えるようになります。

ここでは、MainPageのgetメソッドを修正し、home.htmlテンプレートを読み込むようにしています。テンプレートの読み込みは、まず読み込むテンプレートファイルのパスを取得し、それをtemplateにあるメソッドで読み込んでレンダリング処理をして使います。

まず、テンプレートファイルのパスを用意しなければいけません。これは以下の文で行っています。
fpath = os.path.join(os.path.dirname(__file__),'views','home.html')
「os.path.join」は、ベースとなる第1引数のパスに、第2引数のフォルダ内にある第3引数のファイルを付け足したパスを取得するものです。os.path.dirname(__file__)は、このWebアプリケーションのパスを返すものです。これにより、Webアプリケーションの「views」フォルダ内にある「home.html」ファイルのパスを変数fpathに取り出しているわけです。
html = template.render(fpath,params)
そして、template「render」メソッドを使い、第1引数に指定したパスのテンプレートファイルを読み込み、レンダリング処理をしています。処理して生成されたHTMLソースコードは、変数htmlに保管されます。

このrenderでは、第2引数に、辞書(ディクショナリ)の値を渡すことができます。この値は、レンダリング時にテンプレート内で使用する値をまとめたものです。ここでは、'message'という名前の値が1つ用意されています。

先にテンプレートを作成したとき、{{message}}という特殊なタグが埋め込まれていたことを思い出してください。renderメソッドは、第2引数に渡された値を、>>r[{{値の名前}}という特殊なタグ部分にはめ込んでレンダリングを行うように鳴っているのです。これにより、>>b[{{message}}部分には、'message'という項目に用意された値がはめ込まれ表示されるようになる、というわけです。


※日本語利用時のエラーについて


Python 2.5では、日本語のテキストを扱う場合、そのままではエラーになることがあります。この対処法にはいくつかのやり方があり、私個人は必要に応じて日本語のリテラルに文字コードを指定するようにしています。例えば、こんな具合です。
str = '日本語だよ'.decode('utf-8')
このように文字コードを指定してデコードすることで正しい文字コードでテキストを扱うことができます。が、いちいちこれをやるのがめんどうだという場合は、スクリプトのはじめに、
# -*- coding: utf-8 -*-
このように記述してください。これで、指定の文字コードで扱われるようになります。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

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

class MainPage(webapp.RequestHandler):
    
  def get(self):
    params = {'message':'これは、テンプレートで出力したWebページです。'}
    fpath = os.path.join(os.path.dirname(__file__),'views','home.html')
    html = template.render(fpath,params)
    self.response.headers['Content-Type'] = 'text/html'
    self.response.out.write(html)

application = webapp.WSGIApplication([('/', MainPage)], debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()
※関連コンテンツ

「PythonによるGoogle App Engine(GAE)プログラミング入門」に戻る