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

博客详细介绍了在将Tornado从版本4升级到6.1后遇到的问题,特别是同步客户端HTTPClient不再适用的情况。作者提供了修改建议,即将同步客户端更改为AsyncHTTPClient以解决因事件循环变化导致的问题。

一个老的项目今天更新了一下环境,主要是把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.youkuaiyun.com/myli_binbin/article/details/106136892

使用 Tornado 搭建 WebSocket 客户端,可以按照以下步骤进行: 1. 安装 Tornado 使用 pip 安装 Tornado: ``` pip install tornado ``` 2. 编写客户端代码 在 Tornado 中,可以使用 `websocket.WebSocketClientConnection` 类来创建 WebSocket 客户端连接。以下是一个简单的例子: ```python import tornado.websocket import tornado.ioloop class MyWebSocketClient(tornado.websocket.WebSocketClientConnection): def on_message(self, message): print("Received message: {}".format(message)) def on_close(self): print("Connection closed") if __name__ == "__main__": ws_url = "ws://example.com/socket" ws_client = MyWebSocketClient(ws_url) ws_client.connect() tornado.ioloop.IOLoop.current().start() ``` 在这个例子中,我们创建了一个名为 `MyWebSocketClient` 的类,继承自 `WebSocketClientConnection`。我们重载了 `on_message` 和 `on_close` 方法来处理消息和关闭事件。在 `main` 函数中,我们创建了一个 `MyWebSocketClient` 对象,并调用了 `connect` 方法来建立连接。最后,我们启动了 Tornado 的 I/O 循环。 3. 运行客户端代码 运行客户端代码,即可建立 WebSocket 连接并接收来自服务器的消息。如果你想发送消息,可以使用 `write_message` 方法。例如,在 `MyWebSocketClient` 类中添加以下方法: ```python def send_message(self, message): self.write_message(message) ``` 然后,在 `main` 函数中调用 `ws_client.send_message("hello")` 就可以发送消息了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值