0

如果这已在其他地方得到回答,我深表歉意;我环顾四周,并没有找到明确的答案。

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

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

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

注意:我也愿意使用 Twisted,尽管它的学习曲线似乎要陡峭得多,而且我的需求也很简单。(我会在 Node.js 中执行此操作,但我更愿意在 Python 中处理解析要求)

提前感谢任何可以帮助我指出正确方向的人。

一旦完成,我将开源服务器进程,并感谢任何提供示例或 RTFM 链接到相应文档的人。

4

1 回答 1

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)
于 2013-01-08T19:38:17.953 回答