Google app engine GAE webapp2会话:创建和检查会话的正确过程

Google app engine GAE webapp2会话:创建和检查会话的正确过程,google-app-engine,session,webapp2,Google App Engine,Session,Webapp2,我试图实现GAE的webapp2会话,但似乎很少有关于它的文档。根据,我的步骤如下: 1.配置并将配置添加到主应用程序: config = {} config['webapp2_extras.sessions'] = { 'secret_key': 'my_secret_key', } app = webapp2.WSGIApplication([...], config=config) 2.在登录处理程序中创建会话 # Delete existent session -->

我试图实现GAE的webapp2会话,但似乎很少有关于它的文档。根据,我的步骤如下:

1.配置并将配置添加到主应用程序:

config = {}
config['webapp2_extras.sessions'] = {
    'secret_key': 'my_secret_key',
}
app = webapp2.WSGIApplication([...], config=config)
2.在登录处理程序中创建会话

# Delete existent session
  --> not mention in the tutorial
# member is found    
self.session_store = sessions.get_store(request=handler.request)
self.session['account'] = member.account
3.检查我的程序中的不同位置是否存在会话

if self.session['account']:
    # Session exists
4.用户注销时删除会话

--> not mentioned in the tutorial
我的问题是:

  • 在会话创建过程中(步骤2),我收到错误消息“…对象没有属性‘session’”

  • 如何在步骤2和步骤4中删除会话

  • 整个会话管理过程是否正确


  • 谢谢。

    这里是一个处理程序示例,以及如何使用webapp2额外会话

    带有BaseHandler和MainHandler的main.py

    import webapp2
    from webapp2_extras import sessions
    
    class BaseHandler(webapp2.RequestHandler):              # taken from the webapp2 extrta session example
        def dispatch(self):                                 # override dispatch
            # Get a session store for this request.
            self.session_store = sessions.get_store(request=self.request)
    
            try:
                # Dispatch the request.
                webapp2.RequestHandler.dispatch(self)       # dispatch the main handler
            finally:
                # Save all sessions.
                self.session_store.save_sessions(self.response)
    
        @webapp2.cached_property
        def session(self):
            # Returns a session using the default cookie key.
            return self.session_store.get_session()
    
    class YourMainHandler(BaseHandler):
    
        def get(self):
    
            ....
            self.session['foo'] = 'bar'
    
    
        def post(self):
    
    
            foo = self.session.get('foo')
    
    如果您有单独的login.py:

    .... other imports
    import main
    
    class Login(main.BaseHandler):
    
        def get(self):
    
            ....
            self.session['foo'] = 'bar'
    
    
        def post(self):
    
    
            foo = self.session.get('foo')
    

    这可能不是对这个问题的直接回答,但这是我用gaesessions而不是GAE的webapp2会话找到的解决方案,我想与大家分享。我们开始:

  • 单击“下载ZIP”按钮从下载gaesessions。下载的文件是“gae sessions master.zip”

  • 解压文件(将创建一个目录“gae sessions master”),并将目录“GASessions”复制到应用程序的根目录(即“app.yaml”所在的位置)

  • 在根目录中创建一个名为“appengine_config.py”的文件,其中包含以下内容(复制形式):

  • 用户登录时创建会话(变量帐户是用户的帐户):

  • 检查用户会话是否存在,如果存在,返回用户帐户:

    from gaesessions import get_current_session
    session = get_current_session()
    if session.is_active():
        session.terminate()
    # start a session for the user (old one was terminated)
    session['account'] = account
    
    from gaesessions import get_current_session
    def checkSession():
        session = get_current_session()
        if session.is_active():
            return session['account']
        return False
    
  • 用户注销时删除会话:

    def logout():
        session = get_current_session()
        if session.is_active():
            session.terminate()
    
  • 最后,您可以创建一个cron作业来定期清理过期的会话:

  • cron.yaml:

    - description: daily session cleanup
      url: /clean_up_sessions
      schedule: every day 3:00
      timezone: ... (Your time zone)
    
    功能:

    from gaesessions import delete_expired_sessions
    class clean_up_sessions(webapp2.RequestHandler):
        def get(self):
            while not delete_expired_sessions():
                pass
    

    希望这有帮助。

    在您的
    请求处理程序中
    覆盖
    调度
    : 从webapp2_附加导入会话

    def dispatch(self):
    
        self.session_store = sessions.get_store(request=self.request)
    
        try:
            webapp2.RequestHandler.dispatch(self)
        finally:
            self.session_store.save_sessions(self.response)
    
    并创建一个名为
    会话的
    webapp2.cached_属性

    @webapp2.cached_property
    def session(self):
        return self.session_store.get_session(backend="<whatever you want here>")
    
    这将负责清除旧会话并为您创建新会话,或者:

    self.auth.set_session(self.auth.store.user_to_dict(self.user), remember=True)
    
    至于注销,您只需拨打以下电话:

    self.auth.unset_session()
    

    非常感谢你的帮助。我还在挣扎,但运气不好。假设我有一个模块“login.py”,其中包含类login(webapp2.RequestHandler),用于处理用户登录。还有一个主模块“main.py”,其中包含MainPage类(BaseHandler)。如何更改登录类?我在login.py中导入main,并将类login(webapp2.RequestHandler)更改为login(main.BaseHandler)。错误消息:“module”对象没有属性“BaseHandler”,这就是我所说的:错误消息:“module”对象没有属性“BaseHandler”。在检查用户是否存在时,我实际上不需要会话的用户名。因此,“foo=self.session.get('foo')”似乎不起作用。那我该怎么做呢?此外,如何删除用户的会话(也不知道用户名)?谢谢你的日志。我建议你学习课程和webapp2。最后一点提示:当用户结束会话时,不要写入/保存会话并删除会话cookie。关于basehandler问题,建议您在获得更多专业知识之前,将所有内容保留在同一个文件中。为什么使用gae会话而不是webapp2_extras.sessions?gae sessions将自己与一些会话系统进行比较,但与webapp2的会话不同。非常感谢,Romz。我不知道有webapp2_额外会话。我将尝试一下。在我的应用程序中,auth在数据存储中创建一个独特的模型,它在和UserToken中保存一个密钥,当用户更改密码并注销时,他无法再次登录什么是
    self.auth
    ?似乎
    self.auth
    来自
    self.auth.set_session(self.auth.store.user_to_dict(self.user), remember=True)
    
    self.auth.unset_session()