2008年5月22日木曜日

Google App Engine でシンプルな画面遷移

Handling Forms With webapp - Google App Engine - Google Code のサンプルを参考にした。

 

「遷移元」のページから、フォームの送信で、「遷移先」に遷移する例。

080522-2

 

遷移元を表示するのが Apage クラス。遷移先を表示するのが BPage。両方とも webapp.RequestHandler を継承している。遷移元からのリクエストと遷移先のページを対応付けるのが、webapp.WSGIApplication。

WSGI とは、18.4 wsgiref -- WSGI Utilities and Reference Implementation によると、

The Web Server Gateway Interface (WSGI) is a standard interface between web server software and web applications written in Python. Having a standard interface makes it easy to use an application that supports WSGI with a number of different web servers.

以下にコードを示す。

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

# 遷移元のページ
class APage(webapp.RequestHandler):
    def get(self):
        self.response.out.write(u"""
            <html>
                <head>
                    <title>A</title>
                </head>
                <body>
                    <h1>遷移前</h1>
                    <form action="/seni">
                        お名前:
                        <input type="text" name="name"/>
                        <input type="submit" value="送信" />
                    </form>
                </body>
            </html>
        """)

# 遷移先のページ
class BPage(webapp.RequestHandler):
    def get(self):
        result = u"""
            <html>
                <head>
                    <title>B</title>
                </head>
                <body>
                    <h1>遷移後</h1>
                    <p>お名前:
        """
        # リクエストから文字列を取り出す
        result += cgi.escape(self.request.get("name"))
        result += u"""
                    </p>
                </body>
            </html>
        """
        self.response.out.write(result)

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

if __name__ == "__main__":
    main()

Bpage#get()において、文字列をユニコードとして認識されるようにしておかないと(文字列の先頭の`u')、UnicodeDecodeError が表示される。

 

関連記事