Google App Engineで開発するスケールするアプリケーション(後編)
Google App EngineとTwitterの連携アプリケーション構築
本稿の前編では、Google App Engineの特徴、スケールアウトの基本的な考え方、Google App Engineのインフラ・サーバ構成などについて説明しました。そして中編では、ミニブログサービスのTwitterとGoogle App Engineを連携させたアプリケーションの仕様概要と、設計について説明しました。後編となる本稿では、中編で説明したアプリケーションを実際にプログラミングしていきます。
はじめに
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属性など)。
この記事は参考になりましたか?
- Google App Engineで開発するスケールするアプリケーション連載記事一覧
-
- Google App Engineで開発するスケールするアプリケーション(後編)
- Google App Engineで開発するスケールするアプリケーション(中編)
- Google App Engineで開発するスケールするアプリケーション(前編)
- この記事の著者
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
WINGSプロジェクト 佐藤 治夫 (株式会社ビープラウド)(サトウ ハルオ)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
