【问题标题】:webapp2 Sessions: How do sessions work conceptually?webapp2 会话:会话在概念上是如何工作的?
【发布时间】:2019-02-14 05:41:19
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: google-app-engine session webapp2


    【解决方案1】:

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

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

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

            super(BaseHandler, self).dispatch()
    

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

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

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

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

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

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

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

    【讨论】:

    • 谢谢@Dan。您是否会推荐任何进一步的资源/指南/教程,其中可以学习使用您提到的工具推出会话系统的“秘诀”?似乎 webapp2 是在说“这里有你需要的工具,你知道做什么”。它假设我们(至少我)已经对这一切如何结合起来有了一定的了解。
    • 我发现足够(供我使用)webapp2 的:webapp2.readthedocs.io/en/latest/index.html#tutorials
    猜你喜欢
    • 2012-02-06
    • 2010-09-19
    • 1970-01-01
    • 2016-07-10
    • 2014-10-03
    • 2016-01-20
    • 2016-11-30
    • 1970-01-01
    • 2015-06-12
    相关资源
    最近更新 更多