处理 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 服务器中的所有资源的主要内容,如果未能解决你的问题,请参考以下文章