WSGIとPythonでスマートなWebアプリケーション開発を

第4回 Google App EngineでWSGIを使う

この記事を読むのに必要な時間:およそ 3 分

設定ファイル app.yaml

まずは,アプリケーション設定ファイルapp.yamlを見ていきます。

リスト1 app.yaml

application: wsgisample
version: 1
runtime: python
api_version: 1

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

1行目のアプリケーション名は,実際のサーバ上で動かす際に必要になります。

これは,アプリケーションを作成する際に指定したアプリケーション名で,アプリケーションのドメイン*.appspot.comの*の部分です。今は特に設定する必要もないので, wsgisample とそのままになっています。

2~4行目は,アプリケーションのバージョンやSDKのバージョンなどの情報が入っています。これらは現状ほぼ定形文なので,そのままにしてください。

handlers 以下の部分は,URLによって呼び出すスクリプトを指定します。

URLの指定には正規表現が使えます。この場合は,すべてのURLに来たリクエストをappmain.pyで処理するように設定しています。

データベースの利用

前回までのMessageBoardでは,アプリケーションをサーバとして動作させていたため,書き込みのデータをすべてメモリ上に保存していました。しかしGAEでは,リクエストが来るたびにプロセスを立ち上げてアプリケーションを実行するため,同じ方法ではリクエストを処理した後にデータが消えてしまいます。そこで,データを保存するために,Googleが提供しているデータベースBigTableを使用します。

データベースの利用というと少しハードルが高そうに思えますが,GAEで提供されているデータベースを使用するのはとても簡単です。データベースを使用するための部分はmodel.pyにまとめてあります。

リスト2 model.py

#-*- coding:utf-8 -*-

from google.appengine.ext import db
import datetime

# 書き込みの DB 上のデータを定義する


class Entry(db.Model):
    ''' DB のモデルを定義 '''

    name = db.StringProperty(required=True)
    title = db.StringProperty(required=True)
    body = db.StringProperty(required=True)
    date = db.DateTimeProperty(required=True)



def addEntry(name, title, body):
    ''' 書き込みを保存する '''

    # インスタンスを生成
    entry = Entry(name = name,
                  title = title,
                  body = body,
                  date = datetime.datetime.now())

    # DB に保存する
    entry.put()
    


def getEntries(num=10, start=0):
    ''' 書き込みを取得する '''

    # 全てのデータに対するクエリを生成
    q = Entry.all()

    # date が降順になるように並べ替える
    q.order('-date')

    # start 番目から num 個のエントリを取得
    return q.fetch(num, start)

model.pyの中身はEntryクラス,addEntry関数,getEntries関数の3つです。

Entryクラスでは,データベースに保存するデータのモデルを定義しています。google.appengine.ext.db.Modelを継承したクラスで,アトリビュートにデータの定義を記述します。データの定義は,dbモジュールにある*Propertyクラスで,StringProperty,DateTimeProperty以外にIntegerPropertyやUserPropertyなどが存在します。

addEntry関数では,新しいデータベースエントリを追加しています。追加の方法も非常に簡単で,先ほど定義したEntryクラスのインスタンスを作成し,putメソッドを呼ぶだけです。クラスのコンストラクタには,定義した項目をキーワード引数で渡します。

getEntries関数では,データベースから書き込みデータを取得しています。データベースからデータを読み出す際は,GQLというSQLに似た問い合わせ言語を使用することができます。しかし,今回は複雑な問い合わせを行うわけではないので,クエリオブジェクトを生成して使用しています。

あとはこれらの関数をMessageBoardのaddMessageとlistMessagesで呼び出せば,データの保存と読み込みができます。

まとめ

以上が,前回使用したアプリケーションをGAEで動作させるための変更点です。実際には,データの保存を行う部分とGAE 固有の設定のみですので,それを除くとアプリケーションの動作に影響する部分にはほぼ手を付けていません。GAEは一般的なWeb サーバとは違う特殊な環境ですが,WSGIを利用することにより,ソースコードの変更を最小限に抑えて動作させることができます。

今回は,SDKを使用してWSGIアプリケーションを動作させる,ということに焦点を当てているため,GAEサーバへのアップロードなどは説明していません。 アプリケーションのアップロードなどのより詳しい情報は,GAEのスタートアップガイドを参照してください。

先に述べたように,GAEで利用可能なWebアプリケーションフレームワークには,webapp以外にDjangoというものがあります。DjangoはGAE専用のフレームワークではなく,一般的に利用可能なフレームワークです。Djangoもまた,WSGIから利用することができます。最終回となる次回は,DjangoなどのWSGIで利用できるフレームワークの紹介をする予定です。

著者プロフィール

保坂翔馬(ほさか しょうま)

CGプロダクションでプログラマとしてPloneで作成した社内情報共有ポータルの開発・管理,3Dモデリングソフトのツール・プラグイン開発,システム管理用補助ツール作成など幅広く仕事をしている。主たる業務はPloneポータルの開発。

仲間内ではプログラム言語オタクで通っており,好きな言語はPython, Haskell。

Twitter:@shomah4a