【问题标题】:Returning the result of request返回请求的结果
【发布时间】:2022-09-24 00:53:22
【问题描述】:

我正在通过在后端使用tornado 来开发请求方法。它应该执行获取请求并进行回调,但是我似乎无法返回响应结果。

例如,如果我返回 response.body,这将打印出插入到 HTTPRequest 方法中的 body 参数,而不是返回响应。

这是我的脚本:


class getToken(tornado.web.RequestHandler):

        def __init__(self,url: str, params: str, headers: dict):
            #super(tornado.web.RequestHandler, self).__init__(*args, **kwargs)
            self._client = tornado.httpclient.AsyncHTTPClient()
            self._url = url
            self._body = params
            self._headers = headers


        def response(response):
            return response.request

        @tornado.gen.coroutine
        def _request(self, callback, request):
            try:
                response = yield self._client.fetch(request)
            except tornado.httpclient.HTTPError as e:
                response = e.response
            raise tornado.gen.Return(
                callback(
                    self.response(
                        response
                        )
                    )
                )
        def get_request(self, callback):
            response =  tornado.httpclient.HTTPRequest(self._url,
                                                        method = \'GET\',
                                                        headers = self._headers,
                                                        body = data)
            print(response.body)
            return self._request(
                            callback, 
                            response)

我使用以下内容运行此脚本:

headers = {
    \'Content-Type\': \'application/x-www-form-urlencoded\',
}
url = \'https://query1.finance.yahoo.com/v8/finance/chart/BOIL.L\'

params = \'region=GB&lang=en-GB&includePrePost=false&interval=2m&useYfid=true&range=1d&corsDomain=uk.finance.yahoo.com&.tsrc=finance\'

r = getToken(url = url, params=params, headers=headers)

print(r.get_request(Future.add_done_callback))

结果:

b\'region=GB&lang=en-GB&includePrePost=false&interval=2m&useYfid=true&range=1d&corsDomain=uk.finance.yahoo.com&.tsrc=finance\'

<Future pending cb=[coroutine.<locals>.wrapper.<locals>.<lambda>() at /Users/usr/yahoo/venv/lib/python3.8/site-packages/tornado/gen.py:251]>

响应应该返回一个字典格式,虽然我有点担心为什么未来是悬而未决的。

    标签: python tornado


    【解决方案1】:

    我设法弄清楚了这一点-代码中有一个小错误。

    我们本应该:

    @staticmethod
    def response(response):
        return response.body
    

    对于response

    然后将on_request 替换为async-await 根据tornado 应该使用的方法。

            async def on_request(self, callback, request):
                try:
                    response = await self._client.fetch(request)
                except tornado.httpclient.HTTPError as e:
                    response = e.response
                return callback(
                        self.response(
                            response
                            )
                        )
    

    最后在循环上添加run 方法会产生我之后的结果。

    class getToken(tornado.web.RequestHandler):
    
            def __init__(self,url: str, params: str, headers: dict):
                #super(tornado.web.RequestHandler, self).__init__(*args, **kwargs)
                self._client = tornado.httpclient.AsyncHTTPClient()
                self._url = url
                self._body = params
                self._headers = headers
    
            @staticmethod
            def response(response):
                return response.body
                
            async def on_request(self, callback, request):
                try:
                    response = await self._client.fetch(request)
                except tornado.httpclient.HTTPError as e:
                    response = e.response
                return callback(
                        self.response(
                            response
                            )
                        )
                    )
            def get_request(self, callback):
                response = tornado.httpclient.HTTPRequest(
                                                        self._url, 
                                                        headers = self._headers,
                                                        method='GET')
    
                return self._request(
                            callback, 
                            response)
            #@tornado.gen.coroutine
            def post_request(self, callback):
                if isinstance(self._body, str):
                    response =  tornado.httpclient.HTTPRequest(self._url,
                                                            method = 'POST',
                                                            headers = self._headers,
                                                            body = self._body
                                                            )
    
                    return self._request(
                                callback, 
                                response)
                else:
                    
                    data = f'refresh_token={self._body["refresh_token"]}&client_id={self._body["client_id"]}&client_secret={self._body["client_secret"]}&grant_type=refresh_token'
                    response =  tornado.httpclient.HTTPRequest(self._url,
                                                            method = 'POST',
                                                            headers = self._headers,
                                                            body = data)
                    print(response.body)
                    return self._request(
                                callback, 
                                response)
    
    headers = {
        'Origin': 'https://uk.finance.yahoo.com',
        'Accept': '*/*',
        'Referer': 'https://uk.finance.yahoo.com/quote/%5EFTMC?p=%5EFTMC',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Safari/605.1.15',
    }
    
    params = 'region=GB&lang=en-GB&includePrePost=false&interval=2m&useYfid=true&range=1d&corsDomain=uk.finance.yahoo.com&.tsrc=finance'
    
    url = 'https://query1.finance.yahoo.com/v8/finance/chart/%5EFTMC'
    async def main(request):
        return await request.get_request(print)
    
    if __name__ == '__main__':
        asyncio.run(main(getToken(url, params, headers)))
    
    

    结果:

    b'{"chart":{"result":[{"meta":{"currency":"GBP","symbol":"^FTMC","exchangeName":"FGI","instrumentType":"INDEX","firstTradeDate":504864000,"regularMarketTime":1663947330,"gmtoffset":3600,"timezone":"BST","exchangeTimezoneName":"Europe/London","regularMarketPrice":17972.69,"chartPreviousClose":18331.69,"previousClose":18331.69,"scale":3,"priceHint":2,"currentTradingPeriod":{"pre":{"timezone":"BST","start":1663913700,"end":1663916400,"gmtoffset":3600},"regular":{"timezone":"BST","start":1663916400,"end":1663947000,"gmtoffset":3600},"post":{"timezone":"BST","start":1663947000,"end":1663949700,"gmtoffset":3600}}
    
    ...
    
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      相关资源
      最近更新 更多