2008年5月23日金曜日

Google App Engine でテンプレートを使って画面遷移

前回のコード (Google App Engine でシンプルな画面遷移) は、コントローラ (webapp.RequestHandler のサブクラス) が、画面に表示する内容も生成していた。これを、 Django を利用してコントローラからビューを分離する。

Google App Engine には、Django が含まれている。

For your convenience, the webapp module includes Django's templating engine. This is included with the SDK and is part of App Engine, so you do not need to bundle it to use it.

(Using Templates - Google App Engine - Google Code より)

同上を参考にして、前回のコードを変更した。

 

概略

前回 Apage, Bpage クラスで生成していた HTML を、それぞれ A.html, B.html に移動させた。フォームで投げられたリクエストの内容は、 BPage クラスで取り出し、遷移先である B.html と共に、template に渡す。

080523-1

 

コード

まず、コントローラである APage, BPage を含むファイル。 (gamenseni.py)

import cgi
import wsgiref.handlers
from google.appengine.ext import webapp

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

# 遷移元を表示するコントローラ
class APage(webapp.RequestHandler):
    def get(self):
        # テンプレートで表示する変数
        template_values ={}

        # テンプレートファイルへのパス
        path = os.path.join(os.path.dirname(__file__), 'A.html')
        # template に表示を生成してもらったものを出力
        self.response.out.write(template.render(path, template_values))

# 遷移先を表示するコントローラ
class BPage(webapp.RequestHandler):
    def get(self):
	# フォームから送信された内容を取得する
        template_values ={
            'name':     self.request.get('name')
        }

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

def main():
    # 画面遷移の対応付け
    application = webapp.WSGIApplication(
                    [('/', APage),
                     ('/seni', BPage)],
                    debug=True)
    wsgiref.handlers.CGIHandler().run(application)

if __name__ == "__main__":
    main()

遷移元である、フォームを含む A.html 。

<html>
  <head>
    <title>A</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <h1>遷移前</h1>
    <form action="/seni">
        お名前:
        <input type="text" name="name"/>
        <input type="submit" value="送信" />
    </form>
  </body>
</html>

 

遷移先である B.html 。

<html>
  <head>
    <title>B</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <h1>遷移後</h1>
    <p>お名前: {{ name|escape }}</p>
  </body>
</html>

{{ 変数 }} で、BPage クラスで template に渡された値を表示することができる。

|escape は、 フォームから送信された内容を表示するときに、 HTML エスケープしている。Django ではフィルタと呼ばれる機能。 Django | The Django template language: For template authors | Django Documentation によると、

escape

Escapes a string’s HTML. Specifically, it makes these replacements:

  • "&" to "&amp;"
  • < to "&lt;"
  • > to "&gt;"
  • '"' (double quote) to '&quot;'
  • "'" (single quote) to '&#39;'

 

app.yaml は前回と同じ。

application: gamenseni
version: 1
runtime: python
api_version: 1

handlers:
- url: /.*
  script: gamenseni.py