アプリでセッションを行うための優れた効率的な方法を探しているときに、GAE BoilerplateとGAE Sessionsを見つけました。
GAEB は素晴らしいですが、私のニーズには非常に広大です。Federate Login もデフォルトのユーザー構造も必要ありませんが、デザイン構造といくつかの問題 (ルート、フォームなど) を解決する方法が気に入っています。
GAES は非常にシンプルですが、セッションを処理するのに強力です。私が最も気に入っているのは、すべてを Cookie に保存する方法です。この場合、完全なユーザー エンティティを Cookie に保存するため、次のページ呼び出しでは他のデータストア ヒットは行われません。ユーザー データは常に Cookie から読み取られます。 (これは、ユーザーが何かを更新した場合にデータを更新する必要があることは明らかですが、これは通常ではありません)。
一方、GAEB はユーザー ID のみを保存し、各ページ呼び出しでユーザー名とユーザーの電子メールを取得します。これは、使用する BaseHandler のコードの一部です (GAEB は NDB モデルを使用します)。
@webapp2.cached_property
def username(self):
if self.user:
try:
user_info = models.User.get_by_id(long(self.user_id))
if not user_info.activated:
self.auth.unset_session()
self.redirect_to('home')
else:
return str(user_info.username)
except AttributeError, e:
# avoid AttributeError when the session was delete from the server
logging.error(e)
self.auth.unset_session()
self.redirect_to('home')
return None
メールの場合も同様で、render_template 関数では次のようになります。
def render_template(self, filename, **kwargs):
.... some code.....
# set or overwrite special vars for jinja templates
kwargs.update({
'app_name': self.app.config.get('app_name'),
'user_id': self.user_id,
'username': self.username,
'email': self.email,
... more vars ...
})
kwargs.update(self.auth_config)
この関数はmodels.User.get_by_**field**(long(self.user_id))
@webapp2.cached_property の意味が正確にわからない唯一のことは、このデータストアの読み取りがすべてキャッシュから行われ、実際にはデータストアにヒットしないことを意味する可能性があります。
ヒットをデータベースに保存するためのより良い解決策は何か教えてもらえますか? すべてのユーザーデータを Cookie に入れ (明らかに保護されています)、すべてのページ呼び出しでデータストアにヒットしない方がよいようですが、おそらく私は間違っています (私は GAE に比較的慣れていません)。データストアへの読み取りはキャッシュされ、その後は無料です。