最近の更新履歴

このドキュメントについて

現在、このドキュメントは翻訳中です。翻訳は「伊藤 哲之輔」が2008/1 に開始しました。リンクのテキストに英語を含むものについては、リンク先はまだ英語版であることを意味しています。

誤訳等の指摘についてはhttp://tetsunosukelab.appspot.com/contact へお寄せください。

2009/3 共同執筆にTakayo Hamasaki氏を迎えました。今後とも充実させていこうと思います。

最新情報

  • 誤訳指摘用メールフォームを作成しました。
  • 日本版用のコンテンツを作成していこうと思います
  • チュートリアルの和訳完了
その後はクラスリファレンスの和訳を予定しています。クラスリファレンスそのものが全てそろっていないのでどうしたものか・・・とは思いますが。

なお、公式ドキュメントにてToDoアプリケーションの記事が開始されたようです。追って和訳します。

ToDoリストの作成


ここでは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 を使用したモデル作成
~/utodo$ gaeogen model User
Creating Model user ...
...
~/utodo$ gaeogen model Todo
Creating Model todo ...
...
~/utodo$ gaeogen model Counter
Creating Model counter ...
...

これで "user.py" "todo.py" "counter.py" が "~/utodo/application/mode" ディレクトリに作成されます。
以下のコード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ユーザに属するので、belongs_to メソッドを使用して "User" モデルと "Todo" モデルに関連を構築します。
残りの章では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)
<h1>utodo application</h1>
<a href="{{signin_url}}">Sign in</a> to manage your Todo list.

このHTMLファイル内で、リンクが追加され、リンク先は変数 "signin_url” に格納されます。
コントローラでこの変数に値を入れなければなりません。
コード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 コントローラ作成
~/utodo$ gaeogen controller User signup home
Creating ...

コマンド2では、User コントローラと2つのアクション(w/template files)を作成しました。
サインインしたユーザが、"/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')

このように Google アカウントの e-mail アドレスを "utodo" ユーザ名の key_name に使用します。(後述します)
もし、ユーザが 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アイテムの編集と削除

--

拡張フェーズ

--