Tornado框架路由系统介绍及(IOloop.current().start())启动源码分析
1、前言
众所周知,Django、Flask、Tornado是非常受欢迎的三大Web开发框架,Django大而全、flask小而精、Tornado性能高。那具体他们到底有哪些的优势?在各种项目上又改该如何选择?
Django:
Django走的大而全的方向,开发效率高。它的MTV框架,自带的ORM,admin后台管理,自带的sqlite数据库和开发测试用的服务器,给开发者提高了超高的开发效率。
重量级web框架,功能齐全,提供一站式解决的思路,能让开发者不用在选择上花费大量时间
自带ORM和模板引擎,支持jinja等非官方模板引擎。
自带ORM使Django和关系型数据库耦合度高,如果要使用非关系型数据库,需要使用第三方库
自带数据库管理app
成熟,稳定,开发效率高,相对于Flask,Django的整体封闭性比较好,适合做企业级网站的开发。python web框架的先驱,第三方库丰富
Flask:
Flask是轻量级的框架,自由、灵活、可扩展性强,核心基于Werkzeug WSGI工具和jinja2模板引擎。
适用于做小网站以及web服务的API,开发大型网站无压力,但架构需要自己设计。
与关系型数据库的结合不弱于Django,而与非关系型数据库的结合远远优于Django。
Tornado:
Tornado走的是少而精的方向,性能优越,它最出名的异步非阻塞的设计方式。
Tornado的两大核心模块:
iostraem:对非阻塞的socket进行简单的封装。
ioloop:对I/O多路复用的封装,它实现一个单例。
2、tornado介绍
Tornado 是一个Python web框架和异步网络库 起初由 FriendFeed 开发. 通过使用非阻塞网络I/O, Tornado 可以支持上万级的连接,处理 长连接, WebSockets, 和其他 需要与每个用户保持长久连接的应用.
Tornado 大体上可以被分为4个主要的部分:
web框架 (包括创建web应用的 RequestHandler 类,还有很多其他支持的类).
HTTP的客户端和服务端实现 (HTTPServer and AsyncHTTPClient).
异步网络库 (IOLoop and IOStream), 为HTTP组件提供构建模块,也可以用来实现其他协议.
协程库 (tornado.gen) 允许异步代码写的更直接而不用链式回调的方式.
Tornado web 框架和HTTP server 一起为 WSGI 提供了一个全栈式的选择. 在WSGI容器 (WSGIAdapter) 中使用Tornado web框架或者使用Tornado HTTP server 作为一个其他WSGI框架(WSGIContainer)的容器,这样的组合方式都是有局限性的. 为了充分利用Tornado的特性,你需要一起使用Tornado的web框架和HTTP server.
3、helloworld
import tornado.ioloop
from tornado import web
"""
settings = {
"debug":True}
"""
# 注意:
# 一旦在settings内将debug设置为True就必须以debug模式启动项目。
# 且尽量不要终止项目,一旦终止项目再重新启动就要将之前的进程终止,否则会报端口占用的错误。
class MainHandler(web.RequestHandler):
def get(self):
self.write("Hello World!")
def make_app():
return web.Application([
(r"/",MainHandler)
])
if __name__ == "__main__":
application = make_app()
application.listen(8888)
print("Tornado is starting %s" %'http://localhost:8888')
tornado.ioloop.IOLoop.current().start()
在上面的代码中能够看到,首先定义了一个MainHandler
请求处理类下面的get方法就是代表在浏览器中发送的get请求,函数make_app
则更像是一个路由注册函数,与Flask,Django的路由注册没有太大差别。调用make_app()
会返回Application
类的实例化对象,对象调用listen方法设置监听端口,重点则是在tornado.ioloop.IOLoop.current().start()
这一句start()启动框架
4、Application路由注册源码分析
Application类初始化方法参数介绍
class Application(ReversibleRouter):
"""
一个组成web application的request handler(请求处理器)的集合
"""
def __init__(self, handlers=None, default_host=None, transforms=None,
**settings):
# 输出的分块与压缩
# 设置相应头部的Content-Encoding和Transfer-Encoding
if transforms is Non