Tornado 6.0+用Future替代callback解决参数错误问题
Tornado 6.0+ 替换 callback 使用 Future 解决 TypeError 问题
运行Tornado脚本发送请求并将响应追加到本地HTML时,出现以下错误:
TypeError: init() got an unexpected keyword argument 'callback'
Tornado 6.0版本已移除AsyncHTTPClient.fetch()的callback参数,需改用方法返回的Future对象。以下是修改后的完整代码:
import asyncio import json import tornado.httpclient import tornado.web import tornado.httpserver from tornado.options import define, options define('port', default=9060, help="运行端口9060", type=int) class requestFour(tornado.web.RequestHandler): async def get(self): # arg = self.get_argument('stock') client = tornado.httpclient.AsyncHTTPClient() # 直接await获取响应,无需callback response = await client.fetch('https://books.toscrape.com') # 注意:books.toscrape.com返回的是HTML页面,不是JSON,这里调整处理逻辑 # 如果目标接口是JSON,再用json.loads(response.body) body = response.body.decode('utf-8') self.write(f""" <div style="text-align: center"> <div style="font-size: 72px">页面内容预览</div> <div style="font-size: 24px; margin-top: 20px">部分HTML内容:</div> <div style="font-size: 16px; width: 80%; margin: 0 auto; text-align: left; white-space: pre-wrap">{body[:500]}...</div> </div> """) self.finish() def my_app(): app = tornado.web.Application(handlers=[(r'/', requestFour)]) http_server = tornado.httpserver.HTTPServer(app) return http_server async def main(): app = my_app() app.listen(options.port) shutdown_event = asyncio.Event() await shutdown_event.wait() if __name__ == '__main__': asyncio.run(main())
关键修改点:
- 移除callback参数:调用
client.fetch()时不再传callback,而是通过await(或yield)直接获取响应对象 - 合并响应处理逻辑:不需要单独的
on_response方法,直接在get方法内处理响应结果 - 修正JSON解析错误:原目标地址返回的是HTML而非JSON,因此改用
response.body.decode('utf-8')解析文本,若接口返回JSON则使用json.loads(response.body) - 改用原生async/await:替换
tornado.gen.coroutine装饰器,使用Python原生异步语法,代码更简洁易读(Tornado 5.0+支持)
内容的提问来源于stack exchange,提问作者joe_bill.dollar
相关产品推荐
相关产品推荐

