会话基础

会话是本系列示例中涵盖的最复杂主题,因此需要几个示例才能涵盖所有不同的方面。第一个示例演示了 Twisted Web 会话 API 的基本原理:如何获取当前请求的会话对象以及如何提前使会话过期。

在深入研究 API 之前,让我们先了解一下 Twisted Web 中会话的整体情况。会话由 Session 的实例表示。当应用程序第一次为特定会话请求会话时,Site 会创建一个新的 Session 实例。Session 实例会保留在 Site 实例中,直到它们过期(由于不活动或被显式过期)。在第一次请求特定会话的 Session 对象之后,每次请求该对象时,都会从 Site 中检索它。

现在,我们已经了解了即将出现的 API 的概念基础,下面是示例。这将是一个非常简单的 rpy 脚本,它会告诉用户其唯一的会话标识符,并允许它提前使会话过期。

首先,我们将导入 Resource,以便我们可以定义它的几个子类。

from twisted.web.resource import Resource

接下来,我们将定义一个资源,它会告诉客户端其会话标识符。这可以通过首先使用 Request.getSession 获取会话对象,然后获取会话对象的 uid 属性来轻松实现。

class ShowSession(Resource):
    def render_GET(self, request):
        return b'Your session id is: ' + request.getSession().uid

为了让客户端在会话超时之前使其自己的会话过期,我们将定义另一个资源,它会使它被请求的任何会话过期。这可以通过使用 Session.expire 方法来实现。

class ExpireSession(Resource):
    def render_GET(self, request):
        request.getSession().expire()
        return b'Your session has been expired.'

最后,为了使示例成为 rpy 脚本,我们将创建一个 ShowSession 实例,并使用 Resource.putChild 为它提供一个 ExpireSession 实例作为子项。

resource = ShowSession()
resource.putChild(b"expire", ExpireSession())

这就是完整的示例。您可以启动它并加载顶部页面。您将看到一个(相当不透明的)会话标识符,它在重新加载时保持不变(至少在您从浏览器中刷新 TWISTED_SESSION cookie 或经过足够的时间之前)。然后,您可以访问 expire 子项,然后返回顶部页面,您将看到您拥有一个新的会话。

以下是示例的完整源代码

from twisted.web.resource import Resource

class ShowSession(Resource):
    def render_GET(self, request):
        return b'Your session id is: ' + request.getSession().uid

class ExpireSession(Resource):
    def render_GET(self, request):
        request.getSession().expire()
        return b'Your session has been expired.'

resource = ShowSession()
resource.putChild(b"expire", ExpireSession())