rpy 脚本(或,如何节省一些输入)

本节的目的是向您展示另一种运行 Twisted Web 服务器的方法,该方法使用自定义资源,不需要像之前的示例那样多的代码。

我们要介绍的功能称为 rpy 脚本 。rpy 脚本是一个 Python 源文件,它定义了一个资源,可以加载到 Twisted Web 服务器中。这种方法的优点是您不必编写代码来创建站点或使用 reactor 设置监听端口。这意味着更少的代码行,这些代码行不是专门用于您要完成的任务。

但是,也有一些缺点。rpy 脚本必须具有 .rpy 扩展名。这意味着您不能使用通常的 Python import 语句导入它。这意味着很难在 rpy 脚本中重用代码。这也意味着您不能轻松地对其进行单元测试。rpy 脚本中的代码是在一个不寻常的上下文中评估的。因此,虽然 rpy 脚本可能对测试想法很有用,但它们不建议用于比这更复杂的任务。

好了,在发出警告之后,让我们深入了解。首先,如前所述,rpy 脚本是具有 .rpy 扩展名的 Python 源文件。因此,打开一个适当命名的文件(例如,example.rpy),并将以下代码放入其中

import time

from twisted.web.resource import 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'))

resource = ClockPage()

您可能认出这是来自 第一个动态渲染示例 的资源。不同之处在于您看不到的内容:我们没有导入 reactorSite 。没有对 endpoints.TCP4ServerEndpointrun 的调用。相反,这是 rpy 脚本的核心思想,我们将名称 resource 绑定到我们希望脚本提供的资源。每个 rpy 脚本都必须绑定此名称,并且此名称是 Twisted Web 在 rpy 脚本中唯一关注的。

剩下的就是将这个 rpy 脚本放到 Twisted Web 服务器中。有几种方法可以做到这一点。最简单的方法是使用 twistd

$ twistd -n web --path .

访问 http://localhost:8080/example.rpy 以查看它是否运行。您也可以在此处传递其他参数。 twistd web 具有用于指定要绑定哪个端口号、是否设置 HTTPS 服务器以及更多其他选项。您可以传递给 twistd 的其他选项允许您配置日志记录以不同方式工作,选择不同的 reactor 等。有关选项的完整列表,请参阅 twistd --helptwistd web --help