Webapp2_extras.auth,后端'datastore'无法正常工作

时间:2015-02-26 15:50:51

标签: google-app-engine python-2.7 webapp2

将会话后端设置为数据存储将无法正常工作,因为即使您没有修改会话值,每次调用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

任何人都可以帮助我了解这里发生了什么吗?我该如何解决这个问题?

1 个答案:

答案 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/