【问题标题】:Non-blocking/async URL fetching in Tornado requestTornado 请求中的非阻塞/异步 URL 获取
【发布时间】:2023-11-22 23:09:01
【问题描述】:

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

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

我正在研究 Tornado,因为我无法指望 Web 服务请求的延迟或可用性,并且我需要调用是非阻塞的。 (否则我只会使用 Django)

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

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

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

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

【问题讨论】:

    标签: python tornado


    【解决方案1】:

    我已从我的项目中提取代码示例。它并不完美,但它提供了一个如何使用 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)
    

    【讨论】: