構造とアーキテクチャ
以前のアプリケーションは非常にシンプルであったため、アーキテクチャは必要ありませんでした。 ここで、より複雑で現実的なタスクを設定します。したがって、アプリケーションが成長し始めたときに何が起こるかを考える必要があります。 もちろん、私たちのタスクは発明されたものであり、そのためにアーキテクチャも必要ありませんが、例として、「科学に基づいて」すべてを実行しようとします。

これは、構造の観点からアプリケーションがどのように見えるかです。 青い長方形は、これらのページがすべての人にアクセス可能で表示可能であることを示しています。 黄色は、ユーザーセッションがアクティブな場合にコンテンツが変更される可能性があることを意味します。 オレンジは外界から完全に閉じられており、この前にログインした場合にのみアクセスできます。
上の画像の2つのページ、つまり「Googleでログイン」と「ログアウト」がGAEから提供されます。 私たちに必要なのは:
- いくつかの健全な情報を提供し、ログインを提案するホームページを書く
- すでにログインしているユーザー向けのホームページオプションを作成する
- ログインファクトを登録し、ユーザーをメインページにリダイレクトするログインハンドラーを作成する
- ユーザーがシステムにログインした回数と最後の時間を示す統計ページを作成します。
モデル
このアプリケーションでは、データストレージモデルは非常に単純ですが、GAE Datastoreの機能を説明するにはこれで十分だと思われます。 ユーザーに関する情報、つまりユーザーの識別子、最後の訪問の日時、および訪問回数を保存する必要があるとします。 GAE Datastore言語では、次のようになります。
#!/ usr / bin / env python #エンコード:utf-8 「」 model.py $ Id:model.py 4 2010-01-25 12:14:48Z sigizmund $ ローマンキリロフが2010-01-25に作成。 「」 インポート日時 google.appengine.ext import dbから google.appengine.apiインポートユーザーから クラスVisitor(db.Model): '' ' Google DataStore永続モデルを使用する単純なオブジェクト '' ' '' 'UserPropertyは、Googleの情報をカプセル化します アプリケーションで使用可能なユーザーアカウント。 に設定されています 現在のユーザーをデフォルトのユーザーとして自動的に使用する 新しいオブジェクトが作成されるたびに '' ' user = db.UserProperty(必須= True、auto_current_user_add = True) '' 'DateTimePropertyは、基礎となる標準のdatetime.datetimeを使用します レコードが保存されるたびに今まで自動更新するように設定されています '' ' lastVisit = db.DateTimeProperty(auto_now = True) '' 'デフォルト値0の非常に単純な整数プロパティ' '' hits = db.IntegerProperty(デフォルト= 0)
http://code.google.com/p/habr-gae-helloworld/source/browse/trunk/model.py
誰が何であるかを把握します。
Visitor
クラスは、データストアへのインターフェースである標準のGAEクラス
google.appengine.ext.db.Model
から継承されます。このテクノロジーを使用して永続化するすべてのクラスは、このクラスを拡張する必要があります。
Visitor
クラスには、
user
、
lastVisit
および
hits
3つのデータフィールドがあります。 後者から始めて詳細に検討します。
-
db.IntegerProperty hits
は、通常の整数データ型をカプセル化します。 デフォルトでは、このクラスのすべての新しいオブジェクトには値0が割り当てられます。すべてが単純です。u =訪問者() u.hits = 1 #... hitsCount = u.hits
このようなフィールドの操作は完全に透過的です-原則として、基本的な整数型のオブジェクトと同じように使用します。
-
lastVisit
前のものと同様に、db.DateTimeProperty
は組み込みデータ型をカプセル化しますが、今回はdatetime.datetime
のみです。 概して、違いはありません-指定されたデータ型とフィールドで同じように機能します。 フィールドは、手動で更新する必要がないように構成されています-レコードが保存されるたびに、フィールド値はnow()
設定されnow()
この場合、これは妥当です)。 -
db.UserProperty user
は、ここで使用されるdb.UserProperty user
の中で最も興味深いdb.UserProperty user
です。 GAE users.Userクラスをカプセル化します-ユーザーのメールを保存する必要はありません。メールが変更された場合に一意のIDを保存する必要はありません-すべてあります。 そしてもちろん、これはまさにusers.get_current_user()
作成することでオブジェクトを取得するクラスです。 フィールド設定は、オブジェクトが作成されるたびに、このフィールドの値が現在のユーザーに従って設定されることを示します。
hits
)を設定して、データストアに保存します。
u =訪問者() u.hits = 17 u.put()
これは、オブジェクトを保存し、後でエンティティ
Visitor
一部として使用できるようにするのに十分です。 特定のフィールドの値でオブジェクトを検索する方法については、記事の次の部分で少し後で説明します。 私たちのテストアプリケーションのソースは、 ここで徐々に避難所を見つけており、あなたが書いているようにレイアウトされます。
これは、AppEngineに関する一連の記事の第2部です。 次のパートでは、実際にコントローラーとプレゼンテーションを作成して、おいしいところを説明します。 コメント、提案、質問を待っています。
PSは、Python用の優れた構文ハイライターをアドバイスしてください。Habrでうまく機能しますか? 私がいつも使っていたtohtml.comは、パーサーと互換性のないものを生成します。
更新:第三部-habrahabr.ru/blogs/gae/81933