Django&Tornado&Flask比较
1.Django
Django概述
Django太重,除了web框架,自带ORM和模板引擎,灵活和自由度不够高。Django能开发小应用,但总会有“杀鸡焉用牛刀”的感觉。
Django的自带ORM非常优秀,综合评价略高于SQLAlchemy Django自带的模板引擎简单好用,但其强大程度和综合评价略低于Jinja。
Django自带ORM也使Django与关系型数据库耦合度过高,如果想使用MongoDB等NoSQL数据,需要选取合适的第三方库,且总感觉Django+SQL才是天生一对的搭配,Django+NoSQL砍掉了Django的半壁江山 Django目前支持Jinja等非官方模板引擎 。
Django非常适合企业级网站的开发:快速、靠谱、稳定,成熟,完善,但相比于Flask,Django的整体生态相对封闭。
Django是Python web框架的先驱,用户多,第三方库最丰富,最好的Python库,如果不能直接用到Django中,也一定能找到与之对应的移植 Django上手也比较容易,开发文档详细、完善,相关资料丰富
优点:
-
- 大和全(重量级框架)
- 自带orm,template,view
- 需要的功能也可以去找第三方的app
- 注重高效开发
- 全自动化的管理后台(只需要使用起ORM,做简单的定义,就能自动生成数据库结构,全功能的管理后台)
- session功能
缺点:
- template不怎么好用(来自自身的缺点)
- 数据库用nosql不方便(来自自身的缺点)
- 如果功能不多,容易臃肿
2.Tornado
Tornado 概述
Tornado是Facebook开源出来的框架,其哲学跟Django近乎两个极端。Tornado是异步框架Tornado基本上只算有MVC中C这一层
Tornado走的是少而精的方向,它也有提供模板功能;虽然不鼓励,但作者是可以允许在模板进行少量编码的。
如果跟asp.net相比,Tornado有点类似仅实现了AsyncHttpHandler;除此之外,全部需要自己去实现。
好吧,其实它有模板,有国际化支持,甚至还有内置的OAuth/OpenID模块,方便做第三方登录,它其实也直接实现了Http服务器。
但它没有ORM(仅有一个mysql的超简单封装),甚至没有Session支持,更不要说Django那样自动化的后台。
假设是一个大型网站,在高性能的要求下,框架的各个部分往往都需要定制,可以复用的模块非常少;一个以Django开发的网站,各部分经过不断的定制,Django框架剩下的,很有可能也就是tornado一开始所能提供的这部分。殊途同归。
优点:
-
- 少而精(轻量级框架)
- 注重性能优越,速度快
- 解决高并发(请求处理是基于回调的非阻塞调用)
- 异步非阻塞
- websockets 长连接
- 内嵌了HTTP服务器
- 单线程的异步网络程序,默认启动时根据CPU数量运行多个实例;利用CPU多核的优势
- 自定义模块
缺点:
-
- 模板和数据库部分有很多第三方的模块可供选择,这样不利于封装为一个功能模块
3.Flask概述
Flask确实很“轻”,不愧是Micro Framework,从Django转向Flask的开发者一定会如此感慨,除非二者均为深入使用过 Flask自由、灵活,可扩展性强,第三方库的选择面广,开发时可以结合自己最喜欢用的轮子,也能结合最流行最强大的Python库 入门简单,即便没有多少web开发经验,也能很快做出网站,非常适用于小型网站 非常适用于开发web服务的API 开发大型网站无压力,但代码架构需要自己设计,开发成本取决于开发者的能力和经验,各方面性能均等于或优于Django。Django自带的或第三方的好评如潮的功能,Flask上总会找到与之类似第三方库。
Flask灵活开发,Python高手基本都会喜欢Flask,但对Django却可能褒贬不一 Flask与关系型数据库的配合使用不弱于Django,而其与NoSQL数据库的配合远远优于Django。 Flask比Django更加Pythonic,与Python的philosophy更加吻合。
4.Django与Flask的应用场景
鉴于Flask和Django的特点,如果你是开发一个REST API的系统,没有复杂的分层和逻辑的话,Flask会是一个不错的选择,因为框架内建的功能已经足够你完成这个任务;又或者,你是打算实现一个大型的系统,需要自己重新实现大部分插件的内容,Flask也还是不错,因为它足够的简单,能让你快速的读懂和扩展。
其他的情况我还是推荐你用回Django。尤其是当你需要安装大量的Flask插件,去实现Django本来就有的功能时,你就应该意识到你需要放弃Flask。
当然这只是个人的看法,也没有绝对这一说,主要还是看你想在框架上花费多少的时间。
5.为什么tornado不能使用wsgi?
Tornado可以当作HTTP server,直接TCP开始实现HTTP服务,这也就是为啥说Tornado可以不经过WSGI。实际上它也不是CGI,CGI是指通过stdin和stdout进行HTTP的请求处理,WSGI则是包裹成一个Python对象来传递请求和响应。
WSGI是写入PEP的python的HTTP接口,然而缺点是这个借口是完全同步的,Tornado最大的特点是可以异步处理请求,然而如果使用WSGI,那就不能做到了。官方文档明确指出,将Tornado应用作为WSGI应用时异步接口全部不可用。
相反,Tornado可以作为HTTP server向其它框架提供WSGI容器,所以可以用Tornado来做apache/nginx/guicorn之类的事情。
所以对Tornado而言,如果还要使用nginx之类做前置,正确的姿势应当是通过反向代理来做负载均衡。
6.总结
要性能, Tornado 首选;
要开发速度,Django 和 Flask 都行,区别是 Flask 把许多功能交给第三方库去完成了,因此 Flask 更为灵活。
综上所述:
Django适合初学者或者小团队的快速开发,适合做管理类、博客类网站、或者功能十分复杂需求十分多的网站
Tornado适合高度定制,适合访问量大,异步情况多的网站