Tornado
Tornado是一个基于Python的Web服务框架和 异步网络库。
通过非阻塞I/O,实现高并发,并提供了很多实用的工具类库。
构成
- Web框架
- HTTP客户端和服务器实现
- 异步网络库
- 协程库
Tornado采用的是单进程单线程异步I/O网络模型。
Tornado可以直接作为Web Server来运行,也可以支持WSGI。
快速上手
import tornado.ioloop
import tornado.web
# 请求处理器
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello Tornado")
if __name__ == "__main__":
application = tornado.web.Application([
(r"/", MainHandler),
])
application.listen(8888)
tornado.ioloop.IOLoop.current().start()
从代码可以看出,Tornado需要一个请求处理器,一个路由,一个webApplication实例,指定一个端口号,随后通过IOLoop启动起来。
当然,在Win系统,Python3.8+ 系统直接运行上面的代码会大概率提示一个错误:
raise NotImplementedError
是因为3.8的默认asyncio 依赖不同了,所以,参照下面的代码,第一个支持get方式的tornado服务器就可以运行起来了。
#! /usr/bin/python
# encoding:utf-8
import tornado.ioloop
import tornado.httpserver
import tornado.web
import tornado.options
from tornado.options import define, options
# Python 3.8+ 对WIN的兼容 @see https://blog.csdn.net/hank5658/article/details/106870245
import platform
if platform.system() == "Windows":
import asyncio
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
# 定义端口号
define('port', type=int, default=8182, help='web server port')
# 创建请求处理器
class MainHandler(tornado.web.RequestHandler):
def get(self):
client_id = self.get_argument('id', None)
if client_id is None:
self.write('You are bad client!')
else:
self.write('Welcome client:' + str(client_id))
# 创建路由表
urls = [(r'/', MainHandler), ]
# 创建服务器
def make_app():
# 解析命令行参数
tornado.options.parse_command_line()
# 创建服务器应用,指定路由表
app = tornado.web.Application(urls)
# 指定服务器端口
app.listen(options.port)
# 启动服务器
tornado.ioloop.IOLoop.current().start()
# 应用入口
if __name__ == '__main__':
make_app()