静态 URL 分发

本示例的目的是向您展示如何在不同的 URL 上提供不同的内容。

理解 Twisted Web 中资源 API 如何处理不同 URL 的关键在于理解任何 URL 都可以用来寻址树中的节点。Twisted Web 中的资源存在于这样的树中,对某个 URL 的请求将由该 URL 所寻址的资源进行响应。寻址方案只考虑 URL 的路径段。从根资源(用于构建 Site 的资源)和第一个路径段开始,查找子资源。只要还有路径段,就会使用上一次查找的结果和下一个路径段重复此过程。例如,要处理对 "/foo/bar" 的请求,首先检索根的 "foo" 子项,然后检索该资源的 "bar" 子项,然后使用该资源来创建响应。

有了这些,让我们考虑一个可以在几个不同的 URL 上提供几个不同资源的示例。

首先:我们需要导入 Site,HTTP 服务器的工厂,Resource,一个用于自定义页面的便捷基类,reactor,实现 Twisted 主循环的对象,以及 endpoints,其中包含用于创建监听套接字的类。我们还将导入 File,用作示例 URL 之一中的资源。

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

现在,我们创建一个资源,它将对应于 URL 层次的根:所有 URL 都是此资源的子项。

root = Resource()

现在是这个示例的有趣部分。我们现在将创建另外三个资源,并将它们附加到三个 URL /foo/bar/baz 上。

root.putChild(b"foo", File("/tmp"))
root.putChild(b"bar", File("/lost+found"))
root.putChild(b"baz", File("/opt"))

最后,只需要创建一个带有根资源的 Site,将其与监听服务器端口关联,并启动 reactor。

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

在该服务器运行时,http://localhost:8880/foo 将提供来自 /tmp 的文件列表,http://localhost:8880/bar 将提供来自 /lost+found 的文件列表,而 http://localhost:8880/baz 将提供来自 /opt 的文件列表。

以下是完整的示例,没有中断

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

root = Resource()
root.putChild(b"foo", File("/tmp"))
root.putChild(b"bar", File("/lost+found"))
root.putChild(b"baz", File("/opt"))

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