在寻找一种在我的应用程序中进行会话的好方法时,我发现了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)
似乎从数据存储中读取了 2 次(一次用于用户名,一次用于电子邮件),因为此功能使models.User.get_by_**field**(long(self.user_id))
我唯一不知道的确切含义是@webapp2.cached_property,这可能意味着所有这些数据存储读取都是从缓存中完成的,并且实际上不会命中数据存储。
有人可以告诉我将点击保存到数据库的更好解决方案是什么?似乎最好将所有用户数据都保存在 cookie 中(显然是安全的),并且不要在每次页面调用时都访问数据存储区,但也许我错了(我对 GAE 比较陌生)和所有这些对数据存储的读取被缓存,然后是免费的。