关于tornado5.0后客户端使用发生的变化

44 篇文章 0 订阅

一个老的项目今天更新了一下环境,主要是把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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值