はじめに
Google App Engineは、開発したアプリケーションをGoogleのスケーラブルなインフラ環境上で公開できるサービスです。本稿の前編では、Google App Engineの特徴、スケールアウトの基本的な考え方、Google App Engineのインフラ・サーバ構成などについて説明しました。そして中編では、ミニブログサービスのTwitterとGoogle App Engineを連携させたアプリケーションの仕様概要と、設計について説明しました。後編となる本稿では、中編で説明したアプリケーションを実際にプログラミングしていきます。
対象読者
- Google App Engineに興味がある方
- Webアプリケーション構築の経験がある方
- Googleに興味がある方
必要な環境
本稿のアプリケーションは以下の環境で検証しています(Google App Engineが2010年2月13日現在、サポートしているPythonのバージョンは2.5です)。
- Windows XP
- Google App Engine SDK 1.3.1以降
- Python 2.5
開発言語とWebアプリケーションフレームワーク
Google App Engineでは開発言語としてPythonとJavaがサポートされていますが、本稿ではPythonを用いて開発します。Webアプリケーションフレームワークは、Google App Engine for Pythonに標準で搭載されているwebappというフレームワークを使用します。
アプリケーション全体の概要
本稿で紹介するアプリケーションは、Twitterでフォローするユーザを紹介するGoogle App Engine上で動作するレコメンドアプリケーションです。中編の図1「Twitterレコメンドアプリケーションの概要」に示したように本稿のアプリケーションは、大きく「ユーザデータ取得処理」と「オススメユーザ表示処理」の大きく2つの処理から構成されます。
サンプルアプリケーションのディレクトリ・ファイル構成
まずは、以下の表に本稿で使用するファイルを一覧にまとめました。
ファイル名 | 概要 |
app.yaml | アプリケーション全体の定義ファイル |
cron.yaml | Cron定義ファイル |
index.yaml | インデックス定義ファイル |
main.py | リクエストハンドラを記述するPythonファイル |
models.py | モデル定義を記述するPythonファイル |
twitterutil.py | TwitterにアクセスするためのUtility処理をまとめたPythonファイル |
index.html | リクエスト受付用HTMLファイル |
recommend_list.html | レコメンドユーザ表示用HTML |
エンティティ
本稿のアプリケーションでは、Twitter APIでユーザの情報を取得してDatastoreに保存します。ユーザ情報を格納するクラス(Kind)をmodels.pyファイルに記述します。
TwitterUserクラス
TwitteUser クラスは、中編の表2「アプリケーションで使用するTwitterユーザーの属性」に示したTwitterユーザの属性を保持するためのクラスです。TwitteUserクラスのソースをリスト1に示します。
from google.appengine.ext import db class TwitterUser(db.Model): key = db.Key() seq = db.IntegerProperty() twid = db.IntegerProperty(indexed=False) name = db.StringProperty(indexed=False) screen_name = db.StringProperty(indexed=False) url = db.StringProperty(indexed=False) profile_image_url = db.StringProperty(indexed=False) location = db.StringProperty(multiline=True,indexed=False) description = db.TextProperty() friend_ids = db.ListProperty(long)
TwitterUserクラスは、google.appengine.ext.db.Modelクラスを継承します。このクラスを継承することにより、Datastoreにエンティティとして保存することができるようになります。TwitterUserクラスには、中編の表2に示した属性以外にも、key属性とseq属性を持たせています。key属性は、エンティティを取得する際のキーとして使用する属性で、db.Keyクラスのインスタンスとして定義します。EntityをDatastoreから取得する際には、keyを使って取得すると高速に取得することができます。seq属性は、TwitterUserクラスの作成順に数字の連番を格納するための属性です。連番は後述するCounterクラスから取得します。
インデックスの自動作成
Google App Engineではエンティティの各属性には自動的にインデックスが作成され、検索時に使用することができます(Text属性やBlob属性にはインデックスは作成されません)。デフォルトではアプリケーションが検索に使用しないフィールドにもインデックスが作成されるので、その分datastoreの使用量が増えることになります。そこで検索で使用する予定のない属性には「indexed=False」を定義することで、インデックスを使用しないようにできます(リスト1のtwid属性、name属性など)。