webapp2会话:会话在概念上如何工作?

时间:2018-09-09 17:00:55

标签: google-app-engine session webapp2

我希望在webapp2中实现会话。从研究中,我发现this code sample使用webapp2_extra.sessions,还有几篇文章提到过时或未维护的会话库。

我目前缺乏有关会话在概念上如何工作的知识。到目前为止,这是我的理解:

  1. 我们可以在请求处理程序中包含一个dispatch()方法,该方法允许我们创建/更新会话对象;在应用程序的登录阶段,将创建会话。 (问题:会话如何存储?在应用程序的内存中还是在数据存储中?)
  2. 当用户向应用程序发出请求时,dispatch()方法将检查该用户是否存在现有会话。 (问题:此验证的工作原理是什么?会话在request.body或cookie中是否存在令牌?)
  3. 用户注销后,会话将被删除。

我的理解正确吗?还是我错过了重要的事情?互联网上关于此主题的指导似乎很少。谢谢您的协助。

1 个答案:

答案 0 :(得分:3)

从技术上讲,没有添加dispatch()方法,它只是覆盖webapp2.RequestHandler已经提供的方法,并将其扩展为增加会话支持。如果仔细研究一下该方法,您会发现它仍然调用原始方法进行实际的调度:

        # Dispatch the request.
        webapp2.RequestHandler.dispatch(self)

如果需要,可以将其重写为:

        super(BaseHandler, self).dispatch()

扩展的dispatch()所做的全部工作就是从商店中获取会话信息,以便在分派请求之前将其提供给处理程序代码(BTW包括请求处理),然后将其保存回去。处理完成(可能已更改会话信息时)。对于每个请求!只是在请求中保留信息的一种方式。

会话支持仅仅是- support -您的应用仍然是负责控制在webapp2会话字典中存储哪些信息的应用,何时添加/修改/删除以及如何使用该信息。

换句话说,webapp2本身不知道什么是登录/注销/用户会话等(因此,不行,您在#1,#2和#3中没有提及的事情在webapp2中发生了) 。您的应用有责任:

  • 在会话字典中设置/删除代表“用户会话”的信息(无论对您的应用意味着什么)-通常分别在用户登录/注销请求处理程序中
  • 在处理登录和注销之间的传入请求时使用它认为合适的信息-当会话字典中的信息表示“当前用户会话”时。

用于存储会话信息的webapp2支持cookie(默认),memcachedatastore (ndb)。来自会话:

  

它具有三个内置后端:安全cookie,内存缓存和   数据存储。可以添加新的后端扩展   CustomBackendSessionFactory

     

会话存储可以使用不同的密钥提供多个会话,   通过该方法甚至可以在同一请求中使用不同的后端   SessionStore.get_session()。默认情况下,它使用   配置中的默认密钥。

相关问题