动态生成页面¶
本示例的目的是向您展示如何动态生成页面的内容。
首先处理一些必要的导入,我们将导入 Site
、reactor
和 endpoints
from twisted.internet import reactor, endpoints
from twisted.web.server import Site
Site 是一个工厂,它将监听端口与 HTTP 协议实现相关联。reactor 是驱动任何 Twisted 应用程序的主循环。Endpoints 用于创建监听端口。
接下来,我们将从 Twisted Web 中导入另一个东西:Resource
。Resource
(或其子类)的实例表示一个页面(从技术上讲,由 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()