浅谈五大Python Web框架


Posted in Python onMarch 20, 2017

说到Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework、framework不可胜数,不完全列表见:

http://wiki.python.org/moin/WebFrameworks

虽然另一大脚本语言PHP也有不少框架,但远没有Python这么夸张,也正是因为Python Web Framework(Python Web开发框架,以下简称Python框架)太多,所以在Python社区总有关于Python框架孰优孰劣的话题,讨论的时间跨度甚至长达3-5年。

Python这么多框架,能挨个玩个遍的人不多,坦白的说我也只用过其中的三个开发过项目,另外一些稍微接触过,所以这里只能浅谈一下,欢迎懂行的朋友们补充。

Django

浅谈五大Python Web框架

Python框架虽然说是百花齐放,但仍然有那么一家是最大的,它就是Django。要说Django是Python框架里最好的,有人同意也有人 坚决反对,但说Django的文档最完善、市场占有率最高、招聘职位最多估计大家都没什么意见。Django为人所称道的地方主要有:

完美的文档,Django的成功,我觉得很大一部分原因要归功于Django近乎完美的官方文档(包括Django book)。

全套的解决方案,Django象Rails一样,提供全套的解决方案(full-stack framework + batteries included),基本要什么有什么(比如:cache、session、feed、orm、geo、auth),而且全部Django自己造,开发网 站应手的工具Django基本都给你做好了,因此开发效率是不用说的,出了问题也算好找,不在你的代码里就在Django的源码里。

强大的URL路由配置,Django让你可以设计出非常优雅的URL,在Django里你基本可以跟丑陋的GET参数说拜拜。

自助管理后台,admin interface是Django里比较吸引眼球的一项contrib,让你几乎不用写一行代码就拥有一个完整的后台管理界面。

系统紧耦合,如果你觉得Django内置的某项功能不是很好,想用喜欢的第三方库来代替是很难的,比如下面将要说的ORM、Template。要在Django里用SQLAlchemy或Mako几乎是不可能,即使打了一些补丁用上了也会让你觉得非常非常别扭。

Template功能比较弱,不能插入Python代码,要写复杂一点的逻辑需要另外用Python实现Tag或Filter。关于模板这一点,一直以来争论比较多,最近有两篇关于Python模板的比较有意思的文章可供参考:

1 http://pydanny.blogspot.com/2010/12/stupid-template-languages.html(需FQ)
2 http://techspot.zzzeek.org/2010/12/04/in-response-to-stupid-template-languages/

URL配置虽然强大,但全部要手写,这一点跟Rails的Convention over configuration的理念完全相左,高手和初识Django的人配出来的URL会有很大差异。

数据库schema都给你定好了,这样问题就来了,比如很多网站要求email地址唯一,可schema里这个字段的值不是唯一的,纠结是必须的了。

总的来说,Django大包大揽,用它来快速开发一些Web运用是很不错的。如果你顺着Django的设计哲学来,你会觉得Django很好用,越用越顺手;相反,你如果不能融入或接受Django的设计哲学,你用Django一定会很痛苦,趁早放弃的好。所以说在有些人眼里Django无异于仙丹, 但对有一些人来说它又是毒药且剧毒。

Pylons & TurboGears & repoze.bfg

浅谈五大Python Web框架

除了Django另一个大头就是Pylons了,因为TurboGears2.x是基于Pylons来做的,而repoze.bfg也已经并入Pylons project里这个大的项目里,后面不再单独讨论TurboGears和repoze.bfg了。

Pylons和Django的设计理念完全不同,Pylons本身只有两千行左右的Python代码,不过它还附带有一些几乎就是Pylons御用 的第三方模块。Pylons只提供一个架子和可选方案,你可以根据自己的喜好自由的选择Template、ORM、form、auth等组件,系统高度可 定制。我们常说Python是一个胶水语言(glue language),那么我们完全可以说Pylons就是一个用胶水语言设计的胶水框架。

选择Pylons多是选择了它的自由,选择了自由的同时也预示着你选择了噩梦:

学习噩梦,Pylons依赖于许多第三方库,它们并不是Pylons造,你学Pylons的同时还得学这些库怎么使用,关键有些时候你都不知道你 要学什么。Pylons的学习曲线相对比Django要高的多,而之前Pylons的官方文档也一直是人批评的对象,好在后来出了The Definitive Guide to Pylons这本书,这一局面有所改观。因为这个原因,Pylons一度被誉为只适合高手使用的Python框架。

调试噩梦,因为牵涉到的模块多,一旦有错误发生就比较难定位问题处在哪里。可能是你写的程序的错、也可能是Pylons出错了、再或是SQLAlchemy出错了、搞不好是formencode有bug,反正很凌乱了。这个只有用的很熟了才能解决这个问题。

Pylons和repoze.bfg的融合可能会催生下一个能挑战Django地位的框架。

Tornado web.py

浅谈五大Python Web框架

Tornado即是一个Web server(对此本文不作详述),同时又是一个类web.py的micro-framework,作为框架Tornado的思想主要来源于Web.py,大家在Web.py的网站首页也可以看到Tornado的大佬Bret Taylor的这么一段话(他这里说的FriendFeed用的框架跟Tornado可以看作是一个东西):

“[web.py inspired the] Web framework we use at FriendFeed [and] the webapp framework that ships with App Engine…”

因为有这层关系,后面不再单独讨论Tornado。

一个框架精简的好处在于你可以聚焦在业务逻辑上,而不用太多的去关心框架本身或受框架的干扰,同时缺点也很明显,许多事情你得自己操刀上。

我个人比较偏好这种精简的框架,因为你很容易通过阅读源码弄明白整个框架的工作机制,如果框架那一块不是很合意的话,我完全可以Monkey patch一下按自己的要求来。

Bottle & Flask 

浅谈五大Python Web框架

Bottle和Flask作为新生一代Python框架的代表,挺有意思的是都采用了decorator的方式配置URL路由,如:

from bottle import route, run
 
@route('/:name')
def index(name='World'):
  return '<b>Hello %s!</b>' % name
 
run(host='localhost', port=8080)

Bottle、Flask跟web.py一样,都非常精简,Bottle甚至所有的代码都在那一个两千来行的.py文件里。另外Flask和Pylons一样,可以跟Jinja2、SQLAlchemy之类结合的很好。

不过目前不管是Bottle还是Flask成功案例都还很少。

Quixote

之所以要特别说一下Quixote,是因为国内的最大的用Python开发的网站“豆瓣网”是用Quixote开发的。我只简单翻了一下源代码,没有做过研究,不发表评论,有经验的来补充下。我只是在想,如果豆瓣网交到现在来开发,应该会有更多的选择。

其它(web2py、uliweb、Karrigell、Werkzeug …)

最后关于框架选择的误区

在框架的选择问题上,许多人很容易就陷入了下面两个误区中而不自知:

1. 哪个框架最好——世上没有最好的框架,只有最适合你自己、最适合你的团队的框架。编程语言选择也是一个道理,你的团队Python最熟就用Python好了,如果最熟悉的是Ruby那就用Ruby好了,编程语言、框架都只是工具,能多、快、好、省的干完活就是好东西。

2. 过分关注性能——其实大部分人是没必要太关心框架的性能的,因为你开发的网站根本就是个小站,能上1万的IP的网站已经不多了,上10万的更是很少很少。在没有一定的访问量前谈性能其实是没有多大意义的,因为你的CPU和内存一直就闲着呢。而且语言和框架一般也不会是性能瓶颈,性能问题最常出现在数据库访问和文件读写上。 PHP的Zend Framework是出了名的慢,但是Zend Framework一样有大站,如:digg.com;常被人说有性能问题的Ruby和Rails,不是照样可以开发出twitter吗?再者现在的硬 件、带宽成本其实是很低的,特别有了云计算平台后,人力成本才是最贵的,没有上万的IP根本就不用太在意性能问题,流量上去了花点钱买点服务器空间好了, 简单快速的解决性能问题。

注:前面有网友质疑我“Quora是用Pylons开发的”这样的说法不客观,特说明一下,这里所说的某个网站A是用B开发的,只是指A主要或部分是由B开发的,大家就不要再去纠结A还用C了。

Python 相关文章推荐
一篇不错的Python入门教程
Feb 08 Python
python数组复制拷贝的实现方法
Jun 09 Python
Python对list列表结构中的值进行去重的方法总结
May 07 Python
django模型层(model)进行建表、查询与删除的基础教程
Nov 21 Python
基于Python实现用户管理系统
Feb 26 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
Mar 27 Python
python实现生成Word、docx文件的方法分析
Aug 30 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
基于pycharm实现批量修改变量名
Jun 02 Python
Python私有属性私有方法应用实例解析
Sep 15 Python
Python实现Appium端口检测与释放的实现
Dec 31 Python
Python的Tqdm模块实现进度条配置
Feb 24 Python
python rsa 加密解密
Mar 20 #Python
Python 专题六 局部变量、全局变量global、导入模块变量
Mar 20 #Python
python list排序的两种方法及实例讲解
Mar 20 #Python
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
Mar 20 #Python
Python 专题四 文件基础知识
Mar 20 #Python
python 与GO中操作slice,list的方式实例代码
Mar 20 #Python
Python闭包的两个注意事项(推荐)
Mar 20 #Python
You might like
PHP 时间日期操作实战
2011/08/26 PHP
PHP开发者常犯的10个MySQL错误更正剖析
2012/01/30 PHP
用PHP提取中英文词语以及数字的首字母的方法介绍
2013/04/23 PHP
Laravel服务容器绑定的几种方法总结
2020/06/14 PHP
js使用循环清空某个div中的input标签值
2014/09/29 Javascript
javascript中键盘事件用法实例分析
2015/01/30 Javascript
轻松实现javascript数据双向绑定
2015/11/11 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
jQuery中的deferred对象和extend方法详解
2017/05/08 jQuery
BootStrap自定义popover,点击区域隐藏功能的实现
2018/01/23 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
2018/02/11 Javascript
vue实现底部菜单功能
2018/07/24 Javascript
在Vue项目中取消ESLint代码检测的步骤讲解
2019/01/27 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
jQuery-Citys省市区三级菜单联动插件使用详解
2019/07/26 jQuery
VUE中使用HTTP库Axios方法详解
2020/02/05 Javascript
[58:23]LGD vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
基于并发服务器几种实现方法(总结)
2017/12/29 Python
Python制作词云的方法
2018/01/03 Python
对pandas中to_dict的用法详解
2018/06/05 Python
Python类的继承用法示例
2019/01/31 Python
python 堆和优先队列的使用详解
2019/03/05 Python
python 猴子补丁(monkey patch)
2019/06/26 Python
Pyorch之numpy与torch之间相互转换方式
2019/12/31 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
2020/05/18 Python
如何在VSCode下使用Jupyter的教程详解
2020/07/13 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
德国高品质男装及配饰商城:Cultizm(Raw Denim原色牛仔裤)
2018/04/16 全球购物
师范生实习个人的自我评价
2013/09/28 职场文书
学生学习总结的自我评价
2013/10/22 职场文书
毕业生的自我鉴定该怎么写
2013/12/02 职场文书
出生医学证明样本
2014/01/17 职场文书
大队委竞选演讲稿
2014/04/28 职场文书
关于环保的建议书
2014/05/12 职场文书
2015医德医风个人工作总结
2015/04/02 职场文书
Linux服务器离线安装 nginx的详细步骤
2022/06/16 Servers