在Python的web开发框架中,目前使用量最高的几个是Django
、Flask
和Tornado
, 经常会有人拿这几个对比,相信大家的初步印象应该是 Django
大而全、Flask
小而精、Tornado
性能高。
了解常用框架
Django
主要特点是大而全,集成了很多组件,例如:
Model
、Admin
、Form
等等, 不管你用得到用不到,反正它全都有,属于全能型框架
-
优点
Django
上手也比较容易,开发文档详细、完善,相关资料丰富Django
的自带ORM
非常优秀,综合评价略高于SQLAlchemy
Django
自带的模板引擎简单好用,但其强大程度和综合评价略低于JinjaDjango
目前支持Jinja
等非官方模板引擎Django
自带的数据库管理app好评如潮Django
非常适合企业级网站的开发:快速、靠谱、稳定Django
成熟、稳定、完善,但相比于Flask
,Django
的整体生态相对封闭Django
是Python web
框架的先驱,用户多,第三方库最丰富
-
缺点
Django
太重了,除了web框架,自带ORM
和模板引擎,灵活和自由度不够高Django
能开发小应用,但总会有"杀鸡焉用牛刀"的感觉Django
自带ORM
也使Django
与关系型数据库耦合度过高,如果想使用MongoDB
等NoSQL
数据,需要选取合适的第三方库,且总感觉Django+SQL
才是天生一对的搭配,Django+NoSQL
砍掉了Django
的半壁江山
Flask
主要特点小而轻,原生组件几乎为0, 三方提供的组件请参考
Django
非常全面,属于短小精悍型框架
- 优点
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
更加吻合
- 缺点
- 对于大型网站开发,需要设计路由映射的规则,否则导致代码混乱
Torando
主要特点是原生异步非阻塞,在IO密集型应用和多任务处理上占据绝对性的优势,属于专注型框架
-
优点
- 少而精(轻量级框架)
- 注重性能优越,速度快
- 解决高并发(请求处理是基于回调的非阻塞调用)
- 异步非阻塞
websockets
长连接- 内嵌了
HTTP
服务器 - 单线程的异步网络程序,默认启动时根据CPU数量运行多个实例;利用CPU多核的优势
- 自定义模块
-
缺点
- 模板和数据库部分有很多第三方的模块可供选择,这样不利于封装为一个功能模块
2. Tornado VS Django VS Flask
Tornado
性能比Django
和Flask
高很多
- 底层io处理机制:
Tornado
、gevent
、asyncio
、aiohttp
:自带异步特性,底层使用的是事件循环
+协程
,Nodejs
和Go
语言都得益于协程轻松实现了高并发。因为Tornado
内置了自己的HTTPServer
, 运行和部署它与其他Python web框架不 太一样
Django
和Flask
: 传统的模型,同步框架,阻塞io模型。api写同步代码,使用celery
/apscheduler
处理异步任务。python 传统的这种 wsgi 模型,主要是为了方便框架开发者只需要专注框架层面,而非 http 处理层面。但这样却增加了服务部署的复杂度,需要同时部署和配置 http server
和 wsgi server
,如果想支持异步还要部署 worker
。
- 性能:
最基本的 json
的序列化:Django
与 Flask
占优
处理远程 http
请求的能力:Tornado
占绝对优势
数据库与模板处理性能:Tornado
与 Flask
旗鼓相当,Django
饱受诟病的地方就是 Django ORM
确实很慢,Django
的开发效率与维护非常棒,然而 Django ORM
深度绑定了该框架,如果你需要把 Django ORM
换成其它轮子,那么也意味着 Django 的诸多优秀特性将从此告别