2013-10-08 2 views
4

어떻게 지연을 원자로로 던져서 길 아래 어딘가에서 처리 할 수 ​​있습니까?뒤틀린 : 지연된 '마무리'를 기다리십시오

상황

나는 로컬 호스트에서 실행되는이 개 프로그램이 있습니다.

  1. 뒤틀린 JSONRPC 서비스 (로컬 호스트 : 30,301)
  2. 뒤틀린 웹 서비스 (로컬 호스트 : 4000)
  3. 누군가가 웹 서비스에 연결하면

    은, 그것은 JSONRPC 서비스에 쿼리를 보낼 필요

, 결과가 돌아올 때까지 기다린 다음 사용자의 웹 브라우저에 결과를 표시합니다 (jsonrpc 호출의 값 반환).

지연된 jsonrpc 호출의 값을 반환하는 방법을 알 수없는 것처럼 보입니다. 브라우저로 웹 서비스를 방문하면 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

당신이 여기에서 발생하는 문제는 웹의 IResourceDeferred을 낳은, 아주 오래된 인터페이스 것입니다.

귀하의 문제에 대한 빠른 해결책은 웹 응용 프로그램 작성을위한 twisted.web 등의 편리한 고수준 래퍼를 제공하는 것입니다. 그 중에서도 API 전체에 Deferred에 대한 처리가 많이 추가되었습니다.

twisted.web의 비동기 응답에 대해 구체적으로 말하면 조금 더 둥근 방법으로 주소를 지정하는 것이 read the chapter of the Twisted documentation입니다.

+0

Klein이 좋아 보인다! 설명적인 답변 주셔서 감사합니다. – cpb2

관련 문제