いっしきまさひこBLOG

AI・機械学習関連、Web制作関連、プログラミング関連、旅行記録などなど。一色政彦。

Google App Engine の webapp Frameworkの利用

先ほど紹介した「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.handlers

from 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!』の開発」と同じ内容が実行されます。

googleappengine03.gif

実はここで作成したプログラムは、Google App Engine SDKをインストールしたフォルダ(筆者の場合は「C:\Program Files\Google\google_appengine\」)内の「new_project_template」の内容と同じです。従って、今後、webapp Frameworkを利用したアプリケーションを作成したい場合は、ここからアプリケーションのひな形としてフォルダ全体を任意の場所にコピーして、その内容を編集、拡張していけばよいでしょう。

【目次】「Google App Engineアプリケーション開発入門」―――

Google App Engine環境の準備

Google App Engine SDKの内容

初めてのGoogle App Engine アプリケーションの実行

Google App Engine アプリケーションの実行の仕組み

初めてのGoogle App Engineアプリケーション「Hello World!」の開発

Google App Engine アプリケーションのデバッグ

■Google App Engine の webapp Frameworkの利用