ここではGAEOを使ったToDoリストアプリケーションの作成方法を示します。 このアプリケーションでは、ユーザ認証の流れと、異なるユーザのデータ処理を行います。 では、このアプリケーションのモックを作ることから始めましょう。 デザインフェーズ--モックアップ--モデルデザイン--実装フェーズプロジェクトの作成Google App Engine SDK と 現在のGAEOをインストールしたら、プロジェクトを作成します。必要なパッケージを準備した後、以下のコマンドを実行してプロジェクトを作成してください。 (コマンドプロンプトを使用してください。) コマンド1 "utodo" プロジェクトの作成 ~/$ gaeo utodo GAEOスクリプトは基本的なプロジェクトファイルを含めた "utodo" プロジェクトを作成します。 このアプリケーションの識別子も "utodo" です。 ZIP圧縮されていないリリースパッケージのGAEOをインストールした場合、スクリプト名は gaeo ではなく gaeo.py になるかもしれませんので、ご注意ください。 モデル定義このアプリケーションのモデルデザインを開始します。"User" と "Todo" と "Counter" の3つのモデルが必要です。 "User" モデルはユーザ情報を保持します。 "Todo" モデルは全ToDoリストを保持します。 "Counter" モデルは、BigTable がカウントに適さないので、エントリのカウントに使用します。 コマンド2は gaeogen スクリプトを使用したモデルテンプレートの作成方法です。 コマンド2 gaeogen を使用したモデル作成 これで "user.py" "todo.py" "counter.py" が "~/utodo/application/mode" ディレクトリに作成されます。~/utodo$ gaeogen model User Creating Model user ... ... ~/utodo$ gaeogen model Todo Creating Model todo ... ... ~/utodo$ gaeogen model Counter Creating Model counter ... ... 以下のコード1をこれらのモデルに実装します。 コード1 モデルの作成 (user.py, todo.py, counter.py) # application/model/user.py from google.appengine.ext import db from gaeo.model import BaseModel class User(BaseModel): name = db.StringProperty(required=True) profile = db.StringProperty(multiline=True) created = db.DateTimeProperty(auto_no_add=True) # application/model/todo.py from google.appengine.ext import db from gaeo.model.import BaseModel from model.user import user class Todo(BaseModel): title = db.StringhProperty(required=True) desc = db.TextProperty(required=True) status = db.IntegerProperty(required=True, default=0) created = db.DateTimeProperty(auto_now_add=True) updated = db.DateTimeProperty(auto_now=True) Todo.belongs_to(User) # application/model/counter.py from google.appengine.ext import db from gaeo.model.import BaseModel class Counter(BaseModel): name = db.StringProperty(required=True) count = db.IntegerProperty(required=True, default=0) 残りの章ではToDoリストをどのように1ユーザに特定するかを示します。 welcomeページとユーザサインアップ"/" ページ(welcome コントローラと index アクション)にユーザログイン用のサインインURLを設定します。Google App Engine は Google アカウントでのサインイン/サインアウト API を提供します。 そのため、ユーザは Google または Google Apps アカウントを使用して、Google App Engine のアプリケーションにログイン出来ます。 "utodo" アプリケーションでは、Google アカウントにログインして、"user" モデルに接続します。 では、welcome ページにサインインリンクを追加しましょう。 コード2はHTMLで記述されています。 コード2 welcome ページへのサインインリンク追加(application/templates/welcome/index.html) このHTMLファイル内で、リンクが追加され、リンク先は変数 "signin_url” に格納されます。<h1>utodo application</h1> <a href="{{signin_url}}">Sign in</a> to manage your Todo list. コントローラでこの変数に値を入れなければなりません。 コード3ではアクションにて値を設定します。 コード3 コントローラで "signin_url" の値設定(application/controller/welcome.py) class WelcomeController(BaseController): def index(self): from google.appengine.api import users self.signin_url = users.create_login_url('/user/home') App Engine のサービスを使用して、Google アカウントへのサインインURLを作成し、"/user/home" への転送先を特定します。 つまり、Google アカウントでサインインに成功した場合、ユーザ認証ページは http//yourhost.com/user/home にリダイレクトします。 次のコマンドで "user" コントローラを作成することも出来ます。 コマンド2 user コントローラ作成 コマンド2では、User コントローラと2つのアクション(w/template files)を作成しました。~/utodo$ gaeogen controller User signup home Creating ... サインインしたユーザが、"/user/home" に到達する時、ユーザの "utodo" への初回ログイン時間をチェックしなければなりません。 もしユーザが新規ユーザなら、新しく "utodo" アカウントを作成するために、"/user/signup" へ誘導する必要があります。 (もちろん、Google アカウントと utodo アカウントは連動します。) コード5でこのチェックを行います。 コード5 新規ユーザチェック(application/controller/user.py) ... def home(self): from google.appengine.api import users from model.user import User # ログインした Google アカウント情報を取得 google_acct = users.get_current_user() # TODO: google_acct が None の場合、login ページへ遷移 # e-mail アドレスをユーザデータに取得 utodo_user = User.get_by_key_name(google_acct.email()) if utodo_user is None: self.redirect('/user/signup') もし、ユーザが utodo アカウントにサインアップできなかった場合、 "utodo_user" は None になり、ユーザは "/user/signup" へ誘導されます。 では、"/user/signup" ページにサインアップフォームを設置します。 コード6 サインアップフォーム追加(application/templates/user/signup.html) <form method="post" action="user/create"> <fieldset> <legend>Sign Up An Utodo Account</legend> <p> <label>名前:</label> <input type="text" name="user[name]" id="user_name"> </p> <p> <label>プロフィール:</label> <textarea name="user[profile]" id="user_profile" rows="3" cols="40> </p> <p> <input type="submit" value="Sign up"> </o> </fieldset> </form> フォームデータは "/user/create" に送られて utodo アカウントが作成されます。 それでは、コード7のように User コントローラ内に create アクションを追加します。 コード7 /user/create アクション (application/controller/user.py) .... def create(self): from google.appengine.api import users from model.user import User from model.counter import Counter # フォームデータの取得 data = self.params['user'] google_acct = user.get_current_user() # ユーザデータを作成し、Google アカウントのメールアドレスを key_name にセット u = User(key_name=google_acct.email(), name=data['name'], profile=data['profile']) u.put() # カウンターを追加 c = Counter.get_by_key_name('user') if c is None: c = Counter(key_name='user'. name='user') c.count += 1 c.put() # "/user/home" にリダイレクト self.redirect('/user/home') create アクションで、サインアップフォームから送られたデータを使って、utodo ユーザアカウントを作成します。 ユーザ配列でフォームのフィールド名を特定しているので、 "self.params" から配列を取得できますし、配列を返すことも出来ます。 ユーザデータを作成した後で、"/user/home" のページを開いてください。 現状では、最初 "/user/home" は空白のままです。ToDoアイテムを登録してください。 ToDoアイテムの作成と一覧表示--ToDoアイテムの編集と削除--拡張フェーズ-- |