google-app-engine - webapp2 会话:会话在概念上是如何工作的?
问题描述
我希望在 webapp2 中实现会话。通过研究,我发现这个代码示例使用webapp2_extra.sessions
,以及一些提到已弃用或未维护的会话库的文章。
我目前缺乏关于会话如何在概念上工作的知识。这是我目前所理解的:
- 我们可以
dispatch()
在请求处理程序中包含一个方法,该方法允许我们创建/更新会话对象;在应用程序的登录阶段,会话被创建。(问题:会话如何存储?在应用程序的内存或数据存储中?) - 当用户向应用程序发出请求时,dispatch() 方法会检查用户是否存在现有会话。(问题:这个验证究竟是如何工作的?在 request.body 或会话中寻找的 cookie 中是否有令牌?)
- 当用户注销时,会话将被删除。
我的理解正确吗?或者也许我错过了一些重要的东西?互联网上似乎没有关于这个主题的指导。感谢您的帮助。
解决方案
从技术上讲,没有添加该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()方法使用不同的密钥提供多个会话,甚至在同一个请求中使用不同的后端 。默认情况下,它使用配置中的默认键返回会话。