处理 Twisted Web 服务器中的所有资源

Posted

技术标签:

【中文标题】处理 Twisted Web 服务器中的所有资源【英文标题】:Handling All Resources in a Twisted Web Server 【发布时间】:2012-11-29 08:36:13 【问题描述】:

我正在开发一个响应 GET 和 PUT 请求的 REST API。

由于多种原因,此 API 将使用 Python 和 Twisted 编写。也就是说,扭曲的网络似乎是基于我找到的所有示例的资源。

根据我的理解,这意味着我必须设置单独的资源并为每个资源定义 GET 和 POST 处理程序。

我想做的是设置 GET 和 POST 处理程序,无论请求什么资源,它们都会被调用。

在伪代码中:

import *the appropriate modules*

class Callback(resource.Resource):
    def render_GET(self,request):
        print "GET!"
    def render_POST(self,request):
        print "POST!"

def main():
    *magic*
    reactor.listenTCP(settings.port,factory)
    reactor.run()
    print "Started callback server on port %d" % settings.port

if __name__ == '__main__':
    main()

不幸的是,我在网上搜索的例子没有办法做到这一点。

任何关于如何设置“包罗万象”资源或使用不同反应器类型来处理此问题的意见都非常感谢。

【问题讨论】:

【参考方案1】:

Twisted Web in 60 Seconds 文档系列回答了这个问题(可能还有其他问题:)。

特别是,您询问的是 Twisted Web 中所谓的“动态 URL 调度”。听起来您已经找到了可让您处理静态 URL 调度的 Resource.putChild API。使用动态 URL 调度,您不必为要处理的所有 URL 预先设置处理程序。相反,您重写 getChild 以实现您自己的逻辑来按需创建资源。

请参阅dynamic dispatch 文档了解更多详细信息,但要点是:

class Calendar(Resource):
   def getChild(self, name, request):
       return YearPage(int(name))

这是一个通过创建知道该整数是什么的YearPage 资源来处理任何整数子级的资源。您应该能够执行类似的操作来创建您的 Callback 资源。

【讨论】:

对超过 1 个资源有什么建议吗?例如,我试图找出一种方法,不仅可以执行“calendar/2013”​​,还可以执行“calendar/2013/month/july/day/1”。基本上试图了解如何构造资源和子资源。 这是一个老问题,但我设法通过 getChild 递归来展平目录树。我的页面Resource 因此有一个getChild 函数,看起来像:def getChild(self, name, request): self.name += "/%s" % name return self 这只是递归调用同一个类,并更新self.name 成员,直到它到达子路径的末尾,然后调用render_GET可能应该有一些保护措施来防止堆栈溢出,但这取决于用户。 return self 小心改变共享对象的状态。如果同时处理两个请求并且他们都认为他们可以改变self.name,那么您最终可能会得到至少一个不正确的响应。不幸的是,在您尝试在生产中使用代码之前,这可能会隐藏起来,因为您不太可能在开发期间测试并发请求案例。

以上是关于处理 Twisted Web 服务器中的所有资源的主要内容,如果未能解决你的问题,请参考以下文章

Twisted - CRITICAL - Deferred中的未处理错误...没有堆栈跟踪

Cookie 和Session区别

Portal for ArcGIS 资源承载数据类型

Twisted 中的多重响应

Twisted的WEB开发

Twisted服务器/客户端之间的多个呼叫/响应消息