2014-11-06 35 views
0

我想寫一個簡單的函數,讓我從重複創建AsyncHTTPClientHTTPRequest並做client.fetch釋放我。如何製作簡化與龍捲風AsyncHTTPClient請求的包裝?

現在,我想出了下面的代碼:

def async_fetch(url, method='GET', headers={}, body=None): 
    '''Fetch an HTTP resource asynchronously 
     using `tornado.httpclient.AsyncHTTPClient` 
    ''' 

    if isinstance(body, dict): 
     body = urlencode(body) 

    request = HTTPRequest(url, method=method, headers=headers, body=body) 
    client = AsyncHTTPClient() 
    response = yield client.fetch(request) 
    return response.body 

顯然,這是行不通的。它本身返回一個生成器,我不知道如何將它應用到RequestHandler中。

我只能返回client.fetch(client),這是一個任務,並且在處理程序中產生這個任務,但是我想要處理響應。

任何提示?謝謝!

回答

0

如果您使用tornado >=3您可以使用gen.Return創建返回一些定製協程:

@gen.coroutine 
def async_fetch(url, method='GET', headers={}, body=None): 
    async_http_client = AsyncHTTPClient() 
    http_request = HTTPRequest(url, method=method, headers=headers, body=body) 
    http_response = yield client.fetch(http_request) 
    raise gen.Return(http_response) # That's how return looks in tornado 

class MyHandler(RequestHandler): 
    @gen.coroutine 
    def get(): 
     ... 
     response = yield async_fetch('http://example.org') 
     ... 

在龍捲風2.xa需要更多的世俗的做法:

@gen.engine 
def async_fetch(url, method='GET', headers={}, body=None, callback=None): 
    async_http_client = AsyncHTTPClient() 
    http_request = HTTPRequest(url, method=method, headers=headers, body=body) 
    http_response = yield client.fetch(http_request) 
    if callback: 
     callback(http_response) 

class MyHandler(RequestHandler): 
    @web.asynchronous 
    @gen.engine 
    def get(): 
     ... 
     response = yield gen.Task(async_fetch, 'http://example.org') 
     ... 

你可能甚至去進一步並從async_fetch返回gen.Task的實例。

更新 兩個gen.coroutinegen.Return是有價值的。 gen.coroutine允許從另一個調用一個協程(yield client.fetch(..))。 gen.Return允許從發生器返回一些值。兩者都被引入來克服Python的侷限性 - yield from構造的缺失。

+0

謝謝!我正在檢查。沒想到它那麼簡單。同時我在文檔中記得它提到gen.Return與3.3之後的Python返回相同。所以我猜關鍵不是gen.Return,而是協程裝飾器? – 2014-11-06 09:57:45

+0

@KenetJervet查看更新。希望它會有用。 – Vladimir 2014-11-06 10:44:57