扭曲:等待推迟到'完成'

时间:2013-10-08 19:48:48

标签: python twisted deferred reactor

如何将'延期'投入反应堆,以便在未来的某个地方处理?

场合

我在localhost上运行了2个程序。

  1. 扭曲的jsonrpc服务(localhost:30301)
  2. 扭曲的网络服务(localhost:4000)
  3. 当有人连接到webservice时,它需要向jsonrpc服务发送一个查询,等待它返回结果,然后在用户的Web浏览器中显示结果(返回jsonrpc调用的值) )。

    我似乎无法弄清楚如何返回延迟的jsonrpc调用的值。当我使用浏览器访问webservice时,我得到一个HTML 500错误代码(没有返回任何字节)和Value:<推迟到0x3577b48>。

    它返回延迟对象而不是回调的实际值。

    在询问之前,他们四处寻找并尝试了很多不同的变化。

    from txjsonrpc.web.jsonrpc import Proxy
    from twisted.web import resource
    from twisted.web.server import Site
    from twisted.internet import reactor
    
    
    class Rpc():
        def __init__(self, child):
            self._proxy = Proxy('http://127.0.0.1:30301/%s' % child)
    
        def execute(self, function):
            return self._proxy.callRemote(function)
    
    
    class Server(resource.Resource):
        isLeaf = True
    
        def render_GET(self, request):
            rpc = Rpc('test').execute('test')
    
            def test(result):
                return '<h1>%s</h1>' % result
    
            rpc.addCallback(test)
            return rpc
    
    site = Site(Server())
    reactor.listenTCP(4000, site)
    print 'Running'
    reactor.run()
    

1 个答案:

答案 0 :(得分:4)

您遇到的问题是网络IResource是一个非常旧的界面,甚至比Deferred更早。

问题的快速解决方案是使用Klein,它为twisted.web提供了一个非常方便的高级包装,用于编写Web应用程序,其中包括为Deferred添加大量处理在整个API中。

稍微更迂回的解决方法是read the chapter of the Twisted documentation,具体是关于twisted.web中的异步响应。