2013-10-08 97 views
4

我怎樣才能'推遲'進入反應堆,所以它得到處理的道路上的某個地方?扭曲:等待推遲到'完成'

形勢

我有2個項目在本地主機上運行。

  1. 一個扭曲jsonrpc服務(本地主機:30301)
  2. 一個扭曲的web服務(本地主機:4000)

當有人連接到Web服務,它需要將查詢發送到jsonrpc服務,等待它返回結果,然後在用戶的Web瀏覽器中顯示結果(返回jsonrpc調用的值)。

我似乎無法弄清楚如何返回延遲的jsonrpc調用的值。當我使用瀏覽器訪問web服務時,我得到一個HTML 500錯誤代碼(沒有返回任何字節),並且值:<推遲到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() 

回答

4

您在這裏的問題是,網絡的IResource是一個非常古老的界面,甚至捕食Deferred

問題的快速解決方案是使用Klein,它爲twisted.web提供了一個很好的方便的高層包裝程序,用於編寫Web應用程序,其中包括在整個API中爲Deferred添加大量處理。

稍微更迂迴的方法來解決它是read the chapter of the Twisted documentation這是專門針對twisted.web異步響應。

+0

Klein看起來不錯!感謝您的描述性答案。 – cpb2