2015-08-21 31 views
0

我在Tornado中遇到了異步連接的問題。我想通過訪問Flask端點(/ async/...)來製作代理頁面主體。然後它應該異步獲取該頁面的內容。但我該怎麼做呢?有一個我已經寫過的片段。它打印response.body,但我怎樣才能在proxyAsync中返回它以在網頁上顯示它?在Tornado和Flask中同步運行@ gen.coroutine

@gen.coroutine 
def fetch_coroutine(url): 
    http_client = AsyncHTTPClient() 
    response = yield http_client.fetch(url) 
    print('------------------') 
    print(response.body) 
    print('------------------') 
    raise gen.Return(response.body) 

@proxy_service.route('/async/<path:url>', methods=methodsHTTP) 
def proxyAsync(url): 
    # Send request 
    response = fetch_coroutine(url) 

    return jsonify({}) 

回答

0

@ gen.coroutine返回一個gen.Future實例。這需要處理。否則龍捲風http_client獲取將不會被任何東西完成。

你應該能夠做這樣的事情,使這個片段的工作:

from tornado.ioloop import IOLoop 
def proxyAsync(url): 
    response = IOLoop.current().run_sync(fetch_coroutine(url)) 
    # I presume you wanted to return the response. 
    return jsonify(response) 

你不會得到從異步http_fetch任何好處,無論如何,因爲您的應用程序是基於瓶。

是否有你想使用Flask和Tornado的具體原因? Tornado的web框架很容易使用,然後你的異步http_fetch可以很好地與主應用程序的IOLoop一起使用。