一个老的项目今天更新了一下环境,主要是把tornado从版本4升级到了最新的6.1,出现错误,错误发生的代码如下:
class ForceRefreshHandler(tornado.web.RequestHandler):
def get(self):
tokenType = self.get_argument('type', 'UnKnown')
# 获取token的口令
secret = self.get_argument('secret', 'UnKnown')
ret = {}
if tokenType != 'UnKnown' and secret == config.requestSecret:
request = renderRequest(tokenType)
# 同步客戶端
syncHttpClient = tornado.httpclient.HTTPClient()
try:
response = syncHttpClient.fetch(request)
except Exception as e:
logger.error('Exception: %s', e)
logger.error('Force refresh %s failed.' % str(tokenType))
ret['errmsg'] = str(e)
else:
logger.debug('Sync httpclient response: %s', response)
logger.debug('Sync httpclient response body: %s', response.body)
# response body里面json格式的字典
resDict = json.loads(response.body.decode('utf8'))
logger.info('Force refresh %s success, response is :%s' % (tokenType, resDict))
token = resDict['access_token']
try:
# 存入redis数据库并设置过期时间
wechatRedis.set(tokenType, token, ex=config.tokenExpireTime)
logger.info('Set %s in redis success.', tokenType)
except Exception as e:
logger.error(e)
# 返回请求
ret[tokenType] = resDict['access_token']
ret['expires_in'] = config.tokenExpireTime
syncHttpClient.close()
self.write(json.dumps(ret, sort_keys=False))
*** AttributeError: 'HTTPClient' object has no attribute 'get_argument'
打印self的类型后发现是
<tornado.httpclient.HTTPClient object at 0xffff9cc64790>
这就很迷惑了,这个类不是继承自tornado.web.RequestHandler,怎么变成了tornado.httpclient.HTTPClient?
查了一下,由于自tornado 5.0开始,引入了asycio模块,并且和它共享事件循环,导致客户端的使用方式发生了变化,上面代码中的同步客户端需要改为异步客户端,具体原因还不清楚
class ForceRefreshHandler(tornado.web.RequestHandler):
async def get(self):
...
# 异步客戶端
syncHttpClient = tornado.httpclient.AsyncHTTPClient()
try:
response = await syncHttpClient.fetch(request)
...
参考:
https://www.tornadoweb.org/en/stable/#asyncio-integration
https://www.tornadoweb.org/en/stable/httpclient.html#tornado.httpclient.HTTPClient
https://blog.csdn.net/myli_binbin/article/details/106136892