2014-02-27 4 views
3

토네이도 및 SUDS와 함께 작업하고 있습니다. Tornados AsyncHTTPClient를 사용하여 비동기 호출을 만들고 싶습니다. 여기토네이도 및 SUDS를 사용한 비동기 SOAP 호출

class RequestHandler(tornado.web.RequestHandler): 
@tornado.web.asynchronous 
def post(self): 
    data = tornado.escape.json_decode(self.request.body) 
    uuid = data['id'] 
    suds_client = Client(wsdl_location, nosend=True) 
    context = suds_client.service.GetSubscriptions(uuid)   
    tornado_client = tornado.httpclient.AsyncHTTPClient() 
    tornado_client.fetch(context.envelope,callback=self.on_response) 

def on_response(self,response): 
    print response 
    #self.write(str(response)) 
    self.finish() 

내가 뭔가를 말한다 here

가에는 nosend = 사실과는 봉투를 빌드 설정 한 다음 토네이도 비동기 HTTP를 사용하는 포스트에서 토론을 기준으로 위의 코드에서 = TRUE에는 nosend 설정 내 코드입니다 그것을 가져올 에이전트.

위 코드를 실행할 때 응답이 없습니다. 어떻게 할 수 있습니까? 어떤 도움이라도 감사 할 것입니다. 감사합니다.

답변

3

직접 해결했습니다. 아래의 코드를 참조하고 이해하기 위해 제공 할 것입니다.

class RequestHandler(tornado.web.RequestHandler): 
@tornado.web.asynchronous 
def post(self): 
    data = tornado.escape.json_decode(self.request.body) 
    uuid = data['id'] 
    suds_client = Client(wsdl_location, transport = trans_certs, nosend=True) 
    context = suds_client.service.GetSubscriptions(uuid) 
    tornado_client = tornado.httpclient.AsyncHTTPClient() 
    url=context.client.location() 
    tornado_client.fetch(url,body=str(context.envelope),method="POST",headers=context.client.headers(),callback=self.on_response) 


def on_response(self,response): 
    result=str(response.body) 
    dom1 = parseString(result) 
    for node in dom1.getElementsByTagName('subscriptionId'): 
     self.write(str(node.toxml())) 
    self.finish() 
+0

안녕 @navin, 나는 같은 노력하고 있지만 응답을받지 못하고, 당신은 운송이 무엇을 이해하는 데 도움이 될 수 있는가? 코드에서 trans_certs의 값은 무엇입니까? –

0

감사합니다. 그것은 아주 잘 작동했습니다. Tornado에서 비동기 SOAP 호출을 만들기 위해 ioloop이 아닌 다른 스레드에서 블로킹 메소드를 실행하는 ThreadPoolExecutor 클래스를 사용할 수도 있습니다.

from concurrent.futures import ThreadPoolExecutor 
 
    import tornado.ioloop 
 
    from tornado import concurrent 
 
    from tornado import gen 
 

 
    class asyncExec(object): 
 

 
     def __init__(self,ioloop = None): 
 
     self.executor = ThreadPoolExecutor(max_workers=10) 
 
     self.io_loop = ioloop or tornado.ioloop.IOLoop.instance() 
 

 
     #client is the suds client and remoteMethod is the blocking function 
 

 
     @run_on_executor 
 
     def getResponse(self,client,args): 
 
     response = client.service.remoteMethod(args) 
 
     return(response) 
 

 

 
    #getResponse returns a future object which can be yielded in a coroutine : 
 

 
    @gen.coroutine 
 
    def makeRequest(): 
 
    asyncCaller = AsyncExec() 
 
    response = yield asyncCaller.getResponse(client,args) 
 
    #Do something with response