tornado-redis的使用

因为tornado-redis比较旧了,所以配套的tornado也得比较旧,最高版本是tornado 4.5.3,5.x.x上以的版本会出现以下错误:

ERROR:tornado.application:Uncaught exception GET / (127.0.0.1)
HTTPServerRequest(protocol='http', host='127.0.0.1:8888', method='GET', uri='/', version='HTTP/1.1', remote_ip='127.0.0.1')
Traceback (most recent call last):
  File "D:\Python\Python37\lib\site-packages\tornado\web.py", line 1592, in _execute
    result = yield result
  File "D:\Python\Python37\lib\site-packages\tornado\gen.py", line 1133, in run
    value = future.result()
  File "D:\Python\Python37\lib\site-packages\tornado\gen.py", line 1141, in run
    yielded = self.gen.throw(*exc_info)
  File "D:/区块链/notify2/business/cc_redis.py", line 20, in get
    name = yield tornado.gen.Task(c.set, 'name', 'value')
  File "D:\Python\Python37\lib\site-packages\tornado\gen.py", line 1133, in run
    value = future.result()
  File "D:\Python\Python37\lib\site-packages\tornado\stack_context.py", line 339, in wrapped
    ret = fn(*args, **kwargs)
  File "D:\Python\Python37\lib\site-packages\tornado\gen.py", line 232, in final_callback
    if future.result() is not None:
  File "D:\Python\Python37\lib\site-packages\tornado\gen.py", line 326, in wrapper
    yielded = next(result)
  File "D:\Python\Python37\lib\site-packages\tornadoredis\client.py", line 407, in execute_command
    self.connection.connect()
  File "D:\Python\Python37\lib\site-packages\tornadoredis\connection.py", line 74, in connect
    self._stream = IOStream(sock, io_loop=self._io_loop)
  File "D:\Python\Python37\lib\site-packages\tornado\iostream.py", line 1222, in __init__
    super(IOStream, self).__init__(*args, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'io_loop'
ERROR:tornado.access:500 GET / (127.0.0.1) 13.00ms

但是,如果坚持要用tornado的最新版本和这个一直不更新的tornado-redis一起用,那可以更改一下以下代码,可以正常运行,不过就不知道会不会出现其它什么错误了:

  • 打开tornado-redis安装到python目录下面文件connection.py,我用的是python37,所以我的目录在:D:\Python\Python37\lib\site-packages\tornadoredis\connection.py,找到Connection类下的connect方法,更改如下:
    def connect(self):
        if not self._stream:
            try:
                if self.unix_socket_path:
                    sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
                    sock.settimeout(self.timeout)
                    sock.connect(self.unix_socket_path)
                else:
                    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
                    sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)
                    sock.settimeout(self.timeout)
                    sock.connect((self.host, self.port))
                # 原来的这行,注释掉
                # self._stream = IOStream(sock, io_loop=self._io_loop)
                # 下面这行是增加的
                self._stream = IOStream(sock)
                self._stream.set_close_callback(self.on_stream_close)
                self.info['db'] = 0
                self.info['pass'] = None
            except socket.error as e:
                raise ConnectionError(str(e))
            self.fire_event('on_connect')

tornado-redis在设置了host和port参数的情况下,还一直连接到本地的解决:

conn_pool = tornadoredis.ConnectionPool(max_connections=500, wait_for_available=True)
conn_pool.connection_kwargs['host'] = '192.168.202.128'
conn_pool.connection_kwargs['port'] = 6379

以下是tornaod-redis 在tornado下的一些测试代码:

#coding:utf-8
import tornadoredis
import tornado.httpserver
import tornado.web
import tornado.ioloop
import tornado.gen

conn_pool = tornadoredis.ConnectionPool(max_connections=500, wait_for_available=True)
conn_pool.connection_kwargs['host'] = '192.168.202.128'
conn_pool.connection_kwargs['port'] = 6379
# conn_pool.connection_kwargs['selected_db'] = 1
# print(conn_pool.connection_kwargs)


class MainHandler(tornado.web.RequestHandler):

    @tornado.gen.coroutine
    def get(self):
        c = tornadoredis.Client(selected_db=1, connection_pool=conn_pool)
        yield tornado.gen.Task(c.set, 'name', 'value')
        yield tornado.gen.Task(c.set, 'age', 1)
        yield tornado.gen.Task(c.set, 'height', 170)
        name = yield tornado.gen.Task(c.get, 'name')
        age = yield tornado.gen.Task(c.get, 'age')
        height = yield tornado.gen.Task(c.get, 'height')
        self.write(f"name: {name} age: {age} height: {height}")


if __name__ == '__main__':
    application = tornado.web.Application([
        (r'/', MainHandler),
    ])
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(8888)
    tornado.ioloop.IOLoop.instance().start()



以上测试代码运行的结果如下:
tornado-redis

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Tornado是一个Python的web框架,而Redis是一个开源的内存数据结构存储系统。它们可以一起使用来构建高性能的Web应用程序。 在Tornado使用Redis,可以通过Redis的Python客户端库来实现与Redis服务器的交互。你可以使用这个库来连接到Redis服务器,进行数据的读取和写入操作。 首先,你需要安装Redis的Python客户端库。可以使用pip命令来安装: ``` pip install redis ``` 然后,在你的Tornado应用程序中,你可以创建一个Redis连接,通过该连接来执行各种Redis操作。下面是一个简单的示例代码: ```python import tornado.web import tornado.ioloop import redis # 创建Redis连接 r = redis.Redis(host='localhost', port=6379, db=0) # 定义Tornado请求处理器 class MainHandler(tornado.web.RequestHandler): def get(self): # 从Redis中获取数据 data = r.get('key') # 处理数据并返回响应 self.write('Data from Redis: ' + str(data)) # 创建Tornado应用程序 def make_app(): return tornado.web.Application([ (r'/', MainHandler), ]) if __name__ == '__main__': app = make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start() ``` 在上述示例中,我们首先导入了redis库,并创建了一个Redis连接对象`r`。然后,我们定义了一个Tornado请求处理器`MainHandler`,在`get`方法中从Redis中获取数据,并将其返回给客户端。 最后,我们创建了一个Tornado应用程序,并将请求处理器映射到根URL上。通过运行应用程序并访问http://localhost:8888/,你将会看到从Redis中获取的数据。 这只是一个简单的示例,你可以根据自己的需求来使用RedisTornado进行更复杂的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值