会话基础¶
会话是本系列示例中涵盖的最复杂主题,因此需要几个示例才能涵盖所有不同的方面。第一个示例演示了 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())