将会话后端设置为数据存储将无法正常工作,因为即使您没有修改会话值,每次调用auth.get_user_by_session()都会导致put()到会话实体的数据存储区。
这是因为对auth.get_user_by_session()的调用调用了auth.get_session_data(pop = True)。 Pop = True确实会从session dict对象(来自webapp2_extras.sessions的SessionDict)中弹出_user,这会导致会话将修改属性设置为True。
因此,当处理程序完成它的任务时,在处理程序调度方法中调用save_session将检查会话是否被修改,如果True(总是为真!!!)将执行put到数据存储区。
因此,对于每个请求,会话都会被放入数据存储区,因为显然您在每个请求上都调用了auth.get_user_by_session()。
我不知道如何处理这个问题,但我已经在谷歌代码项目页面中打开了一个问题(似乎已经放弃了): https://code.google.com/p/webapp-improved/issues/detail?id=100&sort=-id
任何人都可以帮助我了解这里发生了什么吗?我该如何解决这个问题?
答案 0 :(得分:1)
因此,如果我们从webapp2_extras.auth
检查以下代码,您将获得以下内容:
def get_user_by_session(self, save_session=True):
"""Returns a user based on the current session.
:param save_session:
If True, saves the user in the session if authentication succeeds.
:returns:
A user dict or None.
"""
if self._user is None:
data = self.get_session_data(pop=True)
if not data:
self._user = _anon
else:
self._user = self.get_user_by_token(
user_id=data['user_id'], token=data['token'],
token_ts=data['token_ts'], cache=data,
cache_ts=data['cache_ts'], remember=data['remember'],
save_session=save_session)
return self._user_or_none()
然后检查get_session_data()
def get_session_data(self, pop=False):
"""Returns the session data as a dictionary.
:param pop:
If True, removes the session.
:returns:
A deserialized session, or None.
"""
func = self.session.pop if pop else self.session.get
rv = func('_user', None)
if rv is not None:
data = self.store.deserialize_session(rv)
if data:
return data
elif not pop:
self.session.pop('_user', None)
return None
如果您在会话中有用户,我不知道为什么会弹出它?它指向user_or_none,如果用户为None,则取消设置会话。
关于webapp2内置授权的惊人博客文章:
http://blog.abahgat.com/2013/01/07/user-authentication-with-webapp2-on-google-app-engine/