2016-05-18 4 views
0

Ich bin wirklich verwirrt von der Tornado-Frame-Arbeit und der "Zukunft" -Objekt. Deshalb möchte ich, indem sie einen HTTP-Aufruf -Code ein Asynchron-Antwort erhalten wird:Wie bekomme ich Inhalt von Tornado zukünftiges Objekt

class TestAsyncHttp(object): 
    def __init__(self): 
     self._http_client = httpclient.AsyncHTTPClient() 

    @gen.coroutine 
    def get_response(self, params) 
     response = yield self._request(
      method='POST', 
      endpoint='test' 
      data=params 
     ) 
     raise gen.Return(response) 

    @gen.coroutine 
    def _request(self, method, endpoint, data): 
     url = self._make_url(endpoint) #this includes the port.. 
     headers = self._load_headers() 
     request = httpclient.HTTPRequest(
      url, 
      method=method, 
      headers=header, 
      body=json.dump(data) 
     ) 
     response = yield self._http_client.fetch(request) 
     raise gen.Return(response) 

Die Sache ist, nachdem ich diese fertig sind, wie kann ich es testen?

Ich versuchte, einen Scrip zu schreiben, enthält ...:

import json 
with open('test/request.json') as json_file: 
    request_json = json.loads(json_file.read()) 

def get_response(): 
    x = TestAsyncHttp() 
    ret = yield x.get_response(request_json) 
    body = ret.body 
    print body['value'] 

get_response 

Aber dann ich 'Python "path-to-the-Skript"' Es gibt nichts ausgegeben. Wenn ich gerade in die "Python" -Umgebung trat, bekam ich "Zukunft" -Objekt nicht getitem ..Wie kann ich den Inhalt aus einer Zukunft bekommen ..?

Danke!

Antwort

0

Verwenden run_sync ein asynchrones Koroutine in synchroner Weise auszuführen:

def get_response(): 
    x = TestAsyncHttp() 
    ret = IOLoop.current().run_sync(lambda: x.get_response(request_json)) 
    body = ret.body 
    print body['value'] 

Die lambda benötigt hier einfach passieren die request_json Parameter. Wenn get_response keine Argumente enthält, können Sie stattdessen Folgendes tun:

ret = IOLoop.current().run_sync(x.get_response) 
Verwandte Themen