使用Tornado、Python进行同步API调用

使用Tornado、Python进行同步API调用,python,asynchronous,tornado,Python,Asynchronous,Tornado,Tornado 5发布后,我们无法在IOLoop运行时使用同步HTTPClient。我们必须改用AsyncHTTPClient 因此,有人可以帮助我,告诉我如何在Tornado(PythonWeb框架)中使用AsyncHTTPClient进行同步API调用,它使用async和await,而不是传统的屈服方法 我试图以这种方式实现它,但一直出现多个错误 class IndexHandler(tornado.web.RequestHandler): async def get_result(

Tornado 5发布后,我们无法在IOLoop运行时使用同步HTTPClient。我们必须改用AsyncHTTPClient

因此,有人可以帮助我,告诉我如何在Tornado(PythonWeb框架)中使用AsyncHTTPClient进行同步API调用,它使用async和await,而不是传统的屈服方法

我试图以这种方式实现它,但一直出现多个错误

class IndexHandler(tornado.web.RequestHandler):
    async def get_result(self, query):
        client = tornado.httpclient.AsyncHTTPClient()
        return await client.fetch("https://pokeapi.co/api/v2/pokemon/" + urllib.parse.urlencode(query))

    def get(self):
        q = self.get_argument('q')
        query = {'q': q}

        loop = asyncio.get_event_loop()
        response = loop.run_until_complete(self.get_result(query))
        loop.close()

        #response = client.fetch("https://pokeapi.co/api/v2/pokemon/" + urllib.parse.urlencode(query))
        #self.on_response(response)
        if response == "Not Found":
            self.write("Invalid Input")
            response_data = json.loads(response.body)
            pikachu_name = response_data['name']
            pikachu_order = response_data['order']
            self.write("""
                Pickachu Name: %s <br>
                Pickachu Order: %d <br>
                """ %(pikachu_name, pikachu_order))
class IndexHandler(tornado.web.RequestHandler):
异步def get_结果(self,query):
client=tornado.httpclient.asynchtpclient()
返回等待客户端。获取(“https://pokeapi.co/api/v2/pokemon/“+urllib.parse.urlencode(查询))
def get(自我):
q=self.get_参数('q')
查询={'q':q}
loop=asyncio.get\u event\u loop()
response=loop.run_直到_完成(self.get_结果(查询))
loop.close()
#response=client.fetch(“https://pokeapi.co/api/v2/pokemon/“+urllib.parse.urlencode(查询))
#自我回应(回应)
如果响应==“未找到”:
self.write(“无效输入”)
response\u data=json.load(response.body)
pikachu_name=响应_数据['name']
pikachu_顺序=响应_数据['order']
self.write(“”)
Pickachu名称:%s
Pickachu订单:%d
“%”(皮卡丘名称、皮卡丘顺序)
但不幸的是,我犯了很多错误

[E 200410 02:40:48 web:1792] Uncaught exception GET /?q=pikachu (::1)
    HTTPServerRequest(protocol='http', host='localhost:8000', method='GET', uri='/?q=pikachu', version='HTTP/1.1', remote_ip='::1')
    Traceback (most recent call last):
      File "C:\Python\Python37\lib\site-packages\tornado\web.py", line 1701, in _execute
        result = method(*self.path_args, **self.path_kwargs)
      File "C:\Users\Bagga\Documents\tornado\Tweet Rate\handlers.py", line 25, in get
        response = loop.run_until_complete(self.get_result(query))
      File "C:\Python\Python37\lib\asyncio\base_events.py", line 571, in run_until_complete
        self.run_forever()
      File "C:\Python\Python37\lib\asyncio\base_events.py", line 526, in run_forever
        raise RuntimeError('This event loop is already running')
    RuntimeError: This event loop is already running
[E 200410 02:40:48 web:2250] 500 GET /?q=pikachu (::1) 3.33ms
[E 200410 02:40:49 base_events:1608] Task exception was never retrieved
    future: <Task finished coro=<IndexHandler.get_result() done, defined at C:\Users\Bagga\Documents\tornado\Tweet Rate\handlers.py:16> exception=HTTP 404: Not Found>
    Traceback (most recent call last):
      File "C:\Users\Bagga\Documents\tornado\Tweet Rate\handlers.py", line 18, in get_result
        return await client.fetch("https://pokeapi.co/api/v2/pokemon/" + urllib.parse.urlencode(query))
    tornado.httpclient.HTTPClientError: HTTP 404: Not Found
[E 200410 02:40:48 web:1792]未捕获的异常获取/?q=pikachu(::1)
HTTPServerRequest(protocol='http',host='localhost:8000',method='GET',uri='/?q=pikachu',version='http/1.1',remote_ip='::1')
回溯(最近一次呼叫最后一次):
文件“C:\Python\Python37\lib\site packages\tornado\web.py”,第1701行,在\u execute中
结果=方法(*self.path_参数,**self.path_参数)
文件“C:\Users\Bagga\Documents\tornado\Tweet Rate\handlers.py”,第25行,在get中
response=loop.run_直到_完成(self.get_结果(查询))
文件“C:\Python\Python37\lib\asyncio\base\u events.py”,第571行,在运行中直到完成
self.run_forever()
文件“C:\Python\Python37\lib\asyncio\base\u events.py”,第526行,永远运行
raise RUNTIMERROR('此事件循环已在运行')
RuntimeError:此事件循环已在运行
[E 200410 02:40:48 web:2250]500 GET/?q=pikachu(::1)3.33毫秒
[E 200410 02:40:49基本事件:1608]从未检索到任务异常
未来:
回溯(最近一次呼叫最后一次):
文件“C:\Users\Bagga\Documents\tornado\Tweet Rate\handlers.py”,第18行,在get\U结果中
返回等待客户端。获取(“https://pokeapi.co/api/v2/pokemon/“+urllib.parse.urlencode(查询))
tornado.httpclient.HTTPClientError:HTTP 404:未找到

我认为对于什么是
同步
请求存在一些混淆;同步请求
在返回结果之前会阻止程序执行(因此整个
IOLoop
);这通常不是你想要的。
异步
请求在完成之前返回;它返回占位符对象(
Futures
),通常使用
wait
yield
关键字将其转换为结果

我认为您正在寻找的是一种等待API请求完成的方法,如上所述,这是通过等待或屈服完成的

class IndexHandler(tornado.web.RequestHandler):
异步def get_结果(self,query):
client=tornado.httpclient.asynchtpclient()
response=wait client.fetch(“https://pokeapi.co/api/v2/pokemon/“+urllib.parse.urlencode(查询))
返回响应.body
异步def get(自):
q=self.get_参数('q')
查询={'q':q}
response=等待self.get\u结果(查询)
如果响应==b“未找到”:
self.write(“无效输入”)
其他:
response\u data=json.load(response.body)
pikachu_name=响应_数据['name']
...
注意

async def get(self):

response=等待self.get\u结果(查询)

bits。

如果您的问题得到了回答,请将其标记为