静态 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()