动态生成页面

本示例的目的是向您展示如何动态生成页面的内容。

首先处理一些必要的导入,我们将导入 Sitereactorendpoints

from twisted.internet import reactor, endpoints
from twisted.web.server import Site

Site 是一个工厂,它将监听端口与 HTTP 协议实现相关联。reactor 是驱动任何 Twisted 应用程序的主循环。Endpoints 用于创建监听端口。

接下来,我们将从 Twisted Web 中导入另一个东西:ResourceResource(或其子类)的实例表示一个页面(从技术上讲,由 URI 寻址的实体)。

from twisted.web.resource import Resource

由于我们将使演示资源成为一个时钟,因此我们还将导入 time 模块

import time

处理完导入后,下一步是定义一个 Resource 子类,它具有我们想要的动态渲染行为。这是一个资源,它生成一个页面,显示当前时间

class ClockPage(Resource):
    isLeaf = True
    def render_GET(self, request):
        return (b"<!DOCTYPE html><html><head><meta charset='utf-8'>"
                b"<title></title></head><body>" + time.ctime().encode('utf-8'))

isLeaf 设置为 True 表示 ClockPage 资源永远不会有任何子资源。

此处的 render_GET 方法将在我们挂钩此资源的 URI 使用 GET 方法请求时被调用。它返回的字节字符串将被发送到浏览器。在本例中,该字节字符串是一个以 UTF-8 编码的 HTML 5 网页。

定义完资源后,我们可以从中创建一个 Site

resource = ClockPage()
factory = Site(resource)

与之前的静态内容示例一样,此配置将我们的资源放在 URI 层次结构的最顶端,即在 / 处。有了这个 Site 实例,我们可以告诉 reactor 创建一个 TCP 服务器 并开始服务请求

endpoint = endpoints.TCP4ServerEndpoint(reactor, 8880)
endpoint.listen(factory)
reactor.run()

以下是无中断的代码

from twisted.internet import reactor, endpoints
from twisted.web.server import Site
from twisted.web.resource import Resource
import time

class ClockPage(Resource):
    isLeaf = True
    def render_GET(self, request):
        return (b"<!DOCTYPE html><html><head><meta charset='utf-8'>"
                b"<title></title></head><body>" + time.ctime().encode('utf-8'))

resource = ClockPage()
factory = Site(resource)
endpoint = endpoints.TCP4ServerEndpoint(reactor, 8880)
endpoint.listen(factory)
reactor.run()