Tornado框架路由系统介绍及(IOloop.current().start())启动源码分析

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python Tornado框架是一个轻量级、高效的Web框架,特别适合处理异步IO操作。以下是Python Tornado框架的说明文档: 1. 安装和运行 可以通过pip安装Tornado框架,具体命令为: ``` pip install tornado ``` 安装完成后,可以通过以下代码启动Tornado服务: ``` import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") def make_app(): return tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": app = make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start() ``` 2. 异步IO支持 Tornado框架的异步IO支持非常好,可以通过coroutine和callback两种方式来实现异步IO操作。以下是coroutine方式的示例代码: ``` import tornado.ioloop import tornado.web import tornado.gen class MainHandler(tornado.web.RequestHandler): @tornado.gen.coroutine def get(self): res = yield self.do_async_task() self.write(res) @tornado.gen.coroutine def do_async_task(self): # 异步IO操作 pass def make_app(): return tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": app = make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start() ``` 3. 路由和请求处理 Tornado框架路由和请求处理非常简单,可以通过RequestHandler类来处理请求。以下是路由和请求处理的示例代码: ``` import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") def make_app(): return tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": app = make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start() ``` 4. 模板引擎支持 Tornado框架内置了模板引擎支持,可以使用jinja2、mako等多种模板引擎。以下是使用jinja2模板引擎的示例代码: ``` import tornado.ioloop import tornado.web import jinja2 class MainHandler(tornado.web.RequestHandler): def get(self): template = self.application.settings['jinja2_env'].get_template('index.html') self.write(template.render()) def make_app(): jinja2_env = jinja2.Environment(loader=jinja2.FileSystemLoader('templates')) return tornado.web.Application([ (r"/", MainHandler), ], jinja2_env=jinja2_env) if __name__ == "__main__": app = make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start() ``` 以上是Python Tornado框架的简单说明文档,更多详细内容可以参考官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值