首页 > 解决方案 > webapp2 会话:会话在概念上是如何工作的?

问题描述

我希望在 webapp2 中实现会话。通过研究,我发现这个代码示例使用webapp2_extra.sessions,以及一些提到已弃用或未维护的会话库的文章。

我目前缺乏关于会话如何在概念上工作的知识。这是我目前所理解的:

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

我的理解正确吗?或者也许我错过了一些重要的东西?互联网上似乎没有关于这个主题的指导。感谢您的帮助。

标签: google-app-enginesessionwebapp2

解决方案


从技术上讲,没有添加该dispatch()方法,它只是覆盖webapp2.RequestHandler已经提供的方法,扩展它以添加会话支持。如果您仔细查看该方法,您会发现它仍然调用原始方法来执行实际调度:

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

如果您愿意,可以将其重写为:

        super(BaseHandler, self).dispatch()

扩展dispatch()所做的只是从存储中获取会话信息,使其在分派请求(顺便说一句包括请求处理)之前可用于处理程序代码,然后在请求处理完成时(当会话更改时)将其保存回来信息可能已经完成)。对于每一个请求!只是一种跨请求保留信息的方法。

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

换句话说webapp2,它本身不知道什么是登录/注销/用户会话等(所以不,你在 #1、#2 和 #3 中提到的任何事情都不会发生webapp2)。您的应用有责任:

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

用于存储会话信息webapp2支持 cookie(默认)、memcache数据存储(ndb)。从会话:

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

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


推荐阅读