Tornado请求中的非阻塞/异步URL提取

时间:2013-01-08 19:34:39

标签: python tornado

如果在别处得到回答,我道歉;我环顾四周,并没有找到明确的答案。

我想使用Tornado接受带有查询字符串参数的HTTP请求,使用这些参数调用NOAA Web服务来获取天气数据,处理/解析NOAA响应,然后将最终数据返回给用户。 / p>

我正在关注Tornado,因为我不能指望Web服务请求的延迟或可用性,我需要调用非阻塞。 (否则我只使用Django)

我还想确保我可以在NOAA请求上设置适当的超时,以便我可以在必要时放弃。

注意:我也愿意使用Twisted,虽然它似乎有更陡峭的学习曲线,我的需求感觉非常简单。 (我会在Node.js中这样做,但我更习惯于处理Python中的解析要求)

提前感谢任何能帮助我指明正确方向的人。

我将在完成后开源服务器流程,并将任何提供示例或RTFM链接的人员归功于相应的文档。

1 个答案:

答案 0 :(得分: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)