我正在尝试使用Tornado发出同步请求。
尝试进行API调用。
main.py
import tornado.web
import tornado.httpserver
import tornado.options
import tornado.ioloop
from tornado.web import url
from handlers import IndexHandler
from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(
handlers=[
url(r"/", IndexHandler),
]
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
我的handlers.py是...
import tornado.web
import tornado.httpclient
import urllib
import json
import datetime
import time
class IndexHandler(tornado.web.RequestHandler):
def get(self):
query = self.get_argument('q')
client = tornado.httpclient.HTTPClient()
response = client.fetch("https://pokeapi.co/api/v2/pokemon/" + urllib.urlencode(("query")))
print(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))
现在我面临的问题是
[E 200407 02:18:37 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 12, in get
client = tornado.httpclient.HTTPClient()
File "C:\Python\Python37\lib\site-packages\tornado\httpclient.py", line 107, in __init__
self._async_client = self._io_loop.run_sync(make_client)
File "C:\Python\Python37\lib\site-packages\tornado\ioloop.py", line 526, in run_sync
self.start()
File "C:\Python\Python37\lib\site-packages\tornado\platform\asyncio.py", line 149, in start
self.asyncio_loop.run_forever()
File "C:\Python\Python37\lib\asyncio\base_events.py", line 529, in run_forever
'Cannot run the event loop while another loop is running')
RuntimeError: Cannot run the event loop while another loop is running
[E 200407 02:18:37 web:2250] 500 GET /?q=pikachu (::1) 55.85ms
问题是什么,我该如何解决?
我在这里看到的主要错误是,
RuntimeError:当另一个循环正在运行时,无法运行事件循环
我认为这是由于IOLoop和HTTPClient引起的,但无法理解是什么问题?
答案 0 :(得分:1)
我引用了documentation of HTTPClient
版本5.0中的更改:由于asyncio中的限制,在IOLoop运行时,不再可以使用同步HTTPClient。请改用AsyncHTTPClient。
请改为使用AsyncHTTPClient
。