概述
Tornado
是一个基于Python的Web服务框架和异步网络库, 最早开发与FriendFeed
公司. 通过利用非阻塞网络 I/O, Tornado 可以承载成千上万的活动连接, 完美的实现了长连接
,WebSockets
, 和其他对于每一位用户来说需要长连接的程序。
安装
# 建议安装在稳定的python版本中
pip install tornado
Tornado的特性
-
作为Web框架,是一个轻量级的Web框架,其拥有异步非阻塞IO的处理方式。
-
作为Web服务器,Tornado有较为出色的抗负载能力,官方用nginx反向代理的方式部署Tornado和其它Python web应用框架进行对比,结果最大浏览量超过第二名近40%。
-
Tornado有着优异的性能。它试图解决C10k问题,即处理大于或等于一万的并发。
-
Tornado是
事件循环
驱动。
了解Tornado
1、RequestHandler
封装了对应一个请求的所有信息和方法,write(响应信息)就是写响应信息的一个方法;对应每一种http请求方式(get、post等),把对应的处理逻辑写进同名的成员方法中(如对应get请求方式,就将对应的处理逻辑写在get()方法中),当没有对应请求方式的成员方法时,会返回“405: Method Not Allowed”错误。
2、Application
Tornado Web框架的核心应用类,是与服务器对接的接口,里面保存了路由信息表,其初始化接收的第一个参数就是一个路由信息映射元组的列表;其listen(端口)方法用来创建一个http服务器实例,并绑定到给定端口(注意:此时服务器并未开启监听)。
3. tornado.ioloop
tornado的核心io循环模块,封装了Linux的epoll和BSD的kqueue,tornado高性能的基石。
**IOLoop.current():**返回当前线程的IOLoop实例。
IOLoop.start(): 启动IOLoop实例的I/O循环,同时服务器监听被打开。
Tornado项目配置
在基类中通过设置请求头信息来完成跨域,同时在options中设置状态。
指定端口可以写自己喜欢的端口 0-65535,不要选被占用的就可以了。
同时我们可以在项目中用peewee操作数据库(异步)。
import tornado.web
from tornado import httpserver
static_path = os.path.join(os.path.dirname(__file__), "static")
db = peewee_async.PooledMySQLDatabase(DB_NAME, host=DB_HOST, port=DB_PORT, user=DB_USER, password=DB_PASSWORD)
class BaseHandler(tornado.web.RequestHandler):
"""
声明基类
"""
def set_default_headers(self):
"""设置请求头信息"""
self.set_header("Access-Control-Allow-Origin", "*")
self.set_header("Access-Control-Allow-Headers", "x-requested-with")
self.set_header("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE")
def options(self, *args):
self.set_status(204)
self.finish()
class TestHandler(BaseHandler):
"""
测试视图
"""
return self.write("hello world!")
if __name__ == '__main__':
app = tornado.web.Application(
handlers=[
(r'/', TestHandler),
],
# 静态资源路径配置
static_path=static_path,
debug=True,
)
# 异步数据库
app.objects = peewee_async.Manager(db)
# 声明服务器
server = httpserver.HTTPServer(app, xheaders=True)
# 端口指定
server.listen(8888)
# 启动ioloop
tornado.ioloop.IOLoop.instance().start()
Tornado Web程序编写思路
- 创建web应用实例对象,第一个初始化参数为路由映射列表。
- 定义实现路由映射列表中的handler类。
- 创建服务器实例,绑定服务器端口。
- 启动当前线程的IOLoop。
总结
Tornado框架比flask还要快,当然任何事物的发展都有其局限性,作为一个web开发人员,我们有必要掌握这门技术,同时,在Tornado框架中我们可以和peewee一起使用,提高效率。上面我构建了一个测试视图类,我们找到项目入口文件,输入python 文件名即可启动项目,视图类我们可以写在别的文件里面,这样我们的代码易读性就大大提高了。