先ほど紹介した「Hello World!」アプリケーションは最も単純なもので、Python言語の基本機能のみを使って作成しました。しかし、Google App Engine には効率的にWebアプリケーションを作成するための「webapp Framework」があらかじめ搭載されています。この入門編の最後では、このwebapp Frameworkを使った基本的な開発方法を紹介しましょう。
ここでは、「初めてのGoogle App Engineアプリケーション『Hello World!』の開発」で示したアプリケーションをwebapp Frameworkを使って作ります。
まずアプリケーションの起動を担うmain関数を作成、実行します。main関数の実行は次のように記述します。
if __name__ == "__main__":main()
肝心のmain関数(function)の定義は次のように記述します。
def main():application = webapp.WSGIApplication(
[('/', MainPage)],
debug=True)
wsgiref.handlers.CGIHandler().run(application)
「def main():」はmain関数を定義することを示しています。webappオブジェクトは、具体的には、次のような記述で(webapp Frameworkの)google.appengine.extパッケージのwebappモジュールを事前にインポートしたものです。
from google.appengine.ext import webapp
webappオブジェクトのWSGIApplicationメソッド(method)を呼び出してapplicationオブジェクトを取得します(WSGIApplicationメソッドについては後述)。そして、そのapplicationオブジェクトを引数に渡してwsgiref.handlers.CGIHandler().runメソッドを呼び出します(=wsgiref.handlersモジュールのCGIHandlerクラスをインスタンス化してそのrunメソッドを呼び出します)。これにより、プログラムが実行されます。(Python標準ライブラリのWSGI:Web Server Gateway Interfaceの)wsgiref.handlersモジュールは、次のような記述で、事前にインポートしたものです。
import wsgiref.handlers
WSGIApplicationメソッドの説明に戻りましょう。その第1引数は、あるURLがリクエストされたときにどのハンドラ クラス(詳細後述)を実行するかを指定するもので、第2引数は「debug=<FalseもしくはTrue>」という形式でデバッグしないかするかを指定します。第1引数についてもう少し詳しく説明すると、次のような形式で指定します。
[(<リクエストされたURL>, <ハンドラ クラス>)
]
つまりURLとハンドラ クラスのマッピングを行います。もちろん複数のマッピングも可能で、例えば「/」というURLのときはMainPageハンドラ クラスにマッピング、「/sign」というURLのときにはGuestbookハンドラ クラスにマッピングしたいなら、次のように記述します。
[('/', MainPage),
('/sign', Guestbook)
]
先ほど説明を保留したハンドラ クラスを説明しましょう。ハンドラ クラスとは、google.appengine.ext.webappモジュールで提供されているRequestHandlerクラスの派生クラスとして作成されたクラスで、あるURLへのリクエストを処理(=ハンドル)するためのものです。ハンドラ クラスには、いくつかのメソッドや属性(attribute)が定義されています(詳しくはコードの説明の中で紹介していきます)。
ここでは、先ほどのWSGIApplicationメソッドに指定したMainPageハンドラ クラスを作成して、基底クラスからgetメソッドをオーバーライドします。具体的には次のようなコードになります。
class MainPage(webapp.RequestHandler):def get(self):
<処理を記述>
そしてgetメソッドの<処理内容を記述>していきます。「初めてのGoogle App Engineアプリケーション『Hello World!』の開発」で示したアプリケーションでは、HTTPリクエストへの応答として、標準出力ストリームに「Content-Type」などのHTTPヘッダ情報とコンテンツを書き込む処理を実装しましたが、ここでもこれと同じ処理になるようにしましょう。getメソッドの引数として渡されたself変数は、MainPageオブジェクト自身です。そのself変数のresponse属性から得られるResponseオブジェクトで応答を設定できます。Responseオブジェクトは次の2つのプロパティを持っていますので、これらを使います。
headersプロパティ(HTTPヘッダ情報を設定します)outプロパティ(標準出力ストリーム。outプロパティのwriteメソッドでコンテンツを書き込めます)
具体的なコードは次のとおりです。
self.response.headers['Content-Type'] = 'text/plain'self.response.out.write('Hello, Google App Engine アプリケーション World!')
ちなみにself変数のrequest属性から得られるRequestオブジェクトからリクエスト データを取得できます。Requestオブジェクトには次のようなプロパティがあります。
uriプロパティ(ユーザーから要求された完全なURI)schemeプロパティ('http' もしくは 'https')
hostプロパティ(ポート番号を含むホスト名)
pathプロパティ(URLで ';' もしくは '?' までのパス)
parametersプロパティ(URLの ';' と '?' の間にある複数の部分文字列。ある場合)
queryプロパティ(URLで '?' 以降の部分)
以上のすべてのコードをまとめると次のようになります。
import wsgiref.handlersfrom google.appengine.ext import webapp
class MainPage(webapp.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('Hello, Google App Engine アプリケーション World!')
def main():
application = webapp.WSGIApplication(
[('/', MainPage)],
debug=True)
wsgiref.handlers.CGIHandler().run(application)
if __name__ == "__main__":
main()
これを実行すると、「初めてのGoogle App Engineアプリケーション『Hello World!』の開発」と同じ内容が実行されます。
実はここで作成したプログラムは、Google App Engine SDKをインストールしたフォルダ(筆者の場合は「C:\Program Files\Google\google_appengine\」)内の「new_project_template」の内容と同じです。従って、今後、webapp Frameworkを利用したアプリケーションを作成したい場合は、ここからアプリケーションのひな形としてフォルダ全体を任意の場所にコピーして、その内容を編集、拡張していけばよいでしょう。
【目次】「Google App Engineアプリケーション開発入門」―――
■初めてのGoogle App Engine アプリケーションの実行
■Google App Engine アプリケーションの実行の仕組み
■初めてのGoogle App Engineアプリケーション「Hello World!」の開発
■Google App Engine アプリケーションのデバッグ
■Google App Engine の webapp Frameworkの利用