Tornado学习心得
tornado吧
全部回复
仅看楼主
level 5
2025年10月27日 20点10分 1
level 5
添加新的协程任务的方法
1. IOLoop.add_callback:添加立刻执行的协程任务(实际上是下次调度循环时执行)
2. IOLoop.call_later:添加延迟执行的协程任务
3. IOLoop.call_at:添加定时执行的协程任务
2025年10月27日 20点10分 3
level 5
自定义TCP服务
1. 自定义服务类XxxServer,继承TCPServer类
2. 在自定义服务类XxxServer中定义handle_stream方法,参数列表为(self, stream, address)
3. XxxServer.handle_stream方法中调用stream.read_bytes从socket读取请求体数据,调用stream.write向socket写入响应体数据
2025年10月27日 20点10分 4
level 5
自定义HTTP服务
1. 自定义RequestHandler类的子类XxxHandler(即XxxHandler类继承RequestHandler)
2. XxxHandler类中定义get方法作为处理GET请求的HTTP Handler函数,定义post方法作为处理POST请求的HTTP Handler函数
3. XxxHandler.get函数内部通过self.write(resp_text)写入返回给HTTP客户端的报文内容
2025年10月27日 20点10分 5
level 5
4. 把所有RequestHandler子类的代码都写好后,定义全局变量urlmap,类型为tuple-elem list
4.1 tuple是2元元组
4.2 tuple的第一个元素是str类型,是路径字符串
4.3 tuple的第二个元素是RequestHandler的子类类型
4.4 最终得到urlmap的结构:[(user_path, UserHandler), (order_path, OrderHandler)]
5. 构造Application类的实例对象,并传入urlmap作为第1个参数
5.1 app = Application(urlmap)
5.2 app.listen(ip, port)
2025年10月27日 20点10分 6
level 5
让线程陷入事件循环
1. 当前线程执行本线程绑定的IOLoop对象的事件循环
IOLoop.current().start()
2. 促使本进程内的主线程绑定的IOLoop对象的事件循环执行
IOLoop.instance().start()
2025年10月27日 20点10分 8
IOLoop.current()获取的是本线程绑定的IOLoop,IOLoop.instance()获取的是领导线程所绑定的IOLoop
2025年10月27日 21点10分
level 5
累累累累累[睡觉]
2025年10月27日 21点10分 9
level 5
创建Web应用对象并启动服务
app = Application(urlmap)
app.listen(listen_ip, listen_port)
IOLoop.instance().start()
2025年10月27日 22点10分 10
勘误:app.listen(listen_ip, listen_port)应为app.listen(listen_port, listen_ip)。其中listen_port是int类型,listen_ip是str类型
2025年10月27日 22点10分
level 5
创建TCP服务对象并启动服务
server = GameServer()
server.listen(listen_port)
IOLoop.instance().start()
2025年10月27日 22点10分 11
改进点:server.listen(listen_port)里的listen_port可改为options.port,从而使得监听端口号可通过程序启动命令里的--port选项配置
2025年10月27日 22点10分
level 5
定义WebSocket服务器
.
class ChatHandler(WebSocketHandler):
....def open(self):
........logging.info('connection open')
.
....def on_message(self, message):
........reversed_message = message[::-1]
........self.write_message(reversed_message)
.
....def on_close(self):
........logging.info('connection closed')
2025年10月27日 22点10分 13
特殊:处理“连接建立”消息的回调函数open没有on_前缀,而另外两个回调函数都有on_前缀
2025年10月27日 22点10分
level 5
定义HTTP Handler
.
class UserHandler(RequestHandler):
....def get(self):
........self.write('ok')
.
....def post(self):
........self.write('ok')
2025年10月27日 23点10分 14
level 5
第一天学习成果总结
1. 定义RequestHandler类的子类UserHandler。并定义get方法、post方法,且它们都只接收1个self参数。get、post内通过self.write(response_string)写入响应报文主体内容
2. __main__代码块内创建Application类的实例对象,构造函数中传入urlmap参数。urlmap取值为[('/user/info', UserHandler)]
3. __main__代码块内调用app.listen(8080)方法,使得应用监听80端口
4. __main__代码块内调用IOLoop.instance().start()正式启动服务
class UserHandler(RequestHandler):
....def get(self):
........self.write('hello')
.
....def post(self):
........self.write('hello')
.
if __name__ == '__main__':
....urlmap = [
........('/user/info', UserHandler),
....]
....app = Application(urlmap)
....app.listen(8080)
....IOLoop.instance().start()
2025年10月28日 21点10分 15
level 5
第一天学习成果总结
1. 定义WebSocketHandler类的子类UserHandler。并定义open方法、on_message方法、on_close方法。open、on_close方法接收1个self参数,on_message方法接收self、message两个参数且message就是客户端发送来的消息体。on_message方法内通过self.write_message(response_bytes)写入响应报文主体内容
2. __main__代码块内创建Application类的实例对象,构造函数中传入urlmap参数。urlmap取值为[('/chat', ChatHandler)]
3. __main__代码块内调用app.listen(8080)方法,使得应用监听80端口
4. __main__代码块内调用IOLoop.instance().start()正式启动服务
class ChatHandler(WebSocketHandler):
....def open(self):
........print('open execute')
.
....def on_message(self, message):
........self.write_message(b'hello')
.
....def on_close(self):
........print('on_close execute')
.
if __name__ == '__main__':
....urlmap = [
........('/chat', ChatHandler),
....]
....app = Application(urlmap)
....app.listen(8080)
....IOLoop.instance().start()
2025年10月28日 22点10分 16
level 5
第一天学习成果总结
1. 定义TCPServer类的子类ChatServer。并定义handle_stream方法。handle_stream方法接收self、stream、address三个参数且stream就是把网络连接封装为字节流读写工具的对象。handle_stream方法内通过self.write(response_string)写入发送给客户端的TCP数据包主体内容
2. __main__代码块内创建ChatServer类的实例对象chat_server
3. __main__代码块内调用chat_server.listen(8080)方法,使得应用监听80端口
4. __main__代码块内调用IOLoop.instance().start()正式启动服务
class ChatServer(TCPServer):
....def handle_stream(self, stream, address):
........msg = stream.read_bytes(512)
........stream.write('hello')
.
if __name__ == '__main__':
....chat_server = ChatServer()
....chat_server.listen(8080)
....IOLoop.instance().start()
2025年10月28日 22点10分 17
level 5
规律总结
1. TCPServer、RequestHandler里写入响应的方法都是self.write,且方法的参数都是str类型
2. WebSocketHandler里写入响应的方法是self.write_message,且方法的参数也是str类型
2025年10月28日 22点10分 18
1 2 尾页