2013-01-08 91 views
0

如果已在其他地方回答了此問題,我表示歉意;我環顧四周,並沒有找到明確的答案。在Tornado請求中獲取非阻塞/異步URL

我想使用Tornado接受帶有查詢字符串參數的HTTP請求,使用這些參數調用NOAA Web服務來獲取天氣數據,處理/解析NOAA響應,然後將最終數據返回給用戶。

我在尋找Tornado,因爲我不能指望Web服務請求的延遲或可用性,我需要這些調用是非阻塞的。 (否則我只是使用Django)

我也想確保我可以在NOAA請求上設置適當的超時時間,所以我可以根據需要放棄。

注意:我也願意使用Twisted,雖然它似乎有更陡峭的學習曲線,我的需求感覺很簡單。 (我會在Node.js中執行此操作,但是我更願意處理Python中的分析需求)

在此先感謝任何能夠幫助我指點正確方向的人。

我將在服務器進程完成後開放源代碼,並將任何有助於提供示例或RTFM鏈接的人列入適當的文檔。

回答

0

我從我的項目中提取了代碼示例。這不是完美的,但它提供了一個想法如何使用Tornadp的AsyncHTTPClient

@tornado.gen.engine 
def async_request(self, callback, server_url, method=u'GET', body=None, **kwargs): 
    """ 
    Make async request to server 
    :param callback: callback to pass results 
    :param server_url: path to required API 
    :param method: HTTP method to use, default - GET 
    :param body: HTTP request body for POST request, default - None 
    :return: None 
    """ 
    args = {} 

    if kwargs: 
     args.update(kwargs) 

    url = '%s?%s' % (server_url, urlencode(args)) 
    request = tornado.httpclient.HTTPRequest(url, method, body=body) 

    http = tornado.httpclient.AsyncHTTPClient() 
    response = yield tornado.gen.Task(http.fetch, request) 

    if response.error: 
     logging.warning("Error response %s fetching %s", response.error, response.request.url) 
     callback(None) 
     return 
    data = tornado.escape.json_decode(response.body) if response else None 
    callback(data)