浅谈五大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字符串加密解密的三种方法分享(base64 win32com)
Jan 19 Python
浅谈Python中range和xrange的区别
Dec 20 Python
Python实现简单文本字符串处理的方法
Jan 22 Python
python读取中文txt文本的方法
Apr 12 Python
django框架自定义用户表操作示例
Aug 07 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
Jul 12 Python
python中下标和切片的使用方法解析
Aug 27 Python
Python:合并两个numpy矩阵的实现
Dec 02 Python
Django 解决model 反向引用中的related_name问题
May 19 Python
Django ModelForm组件原理及用法详解
Oct 12 Python
Python 可视化神器Plotly详解
Dec 26 Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 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动态创建Flash动画
2006/10/09 PHP
[原创]php获取数组中键值最大数组项的索引值
2015/03/17 PHP
浅谈PHP中的
2016/04/23 PHP
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
2020/04/06 PHP
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
JavaScript 替换Html标签实现代码
2009/10/14 Javascript
js escape,unescape解决中文乱码问题的方法
2010/05/26 Javascript
用jquery实现的模拟QQ邮箱里的收件人选取及其他效果(一)
2011/01/06 Javascript
jquery制作多功能轮播图插件
2015/04/02 Javascript
JavaScript对象创建模式实例汇总
2016/10/03 Javascript
zTree jQuery 树插件的使用(实例讲解)
2017/09/25 jQuery
Element-ui table中过滤条件变更表格内容的方法
2018/03/02 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
2018/06/14 Javascript
jQuery实现动画、消失、显现、渐出、渐入效果示例
2018/09/06 jQuery
如何使用VuePress搭建一个类型element ui文档
2019/02/14 Javascript
JS使用iView的Dropdown实现一个右键菜单
2019/05/06 Javascript
详解基于Wepy开发小程序插件(推荐)
2019/08/01 Javascript
vue制作toast组件npm包示例代码
2020/10/29 Javascript
element 动态合并表格的步骤
2020/12/31 Javascript
vue常用高阶函数及综合实例
2021/02/25 Vue.js
Python中属性和描述符的正确使用
2016/08/23 Python
python+django+sql学生信息管理后台开发
2018/01/11 Python
使用python爬取B站千万级数据
2018/06/08 Python
python3 面向对象__类的内置属性与方法的实例代码
2018/11/09 Python
python dlib人脸识别代码实例
2019/04/04 Python
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
python web框架 django wsgi原理解析
2019/08/20 Python
澳大利亚100%丝绸多彩度假装商店:TheSwankStore
2019/09/04 全球购物
Tomcat Mysql datasource数据源配置
2015/12/28 面试题
测绘工程本科生求职信
2013/10/10 职场文书
采购人员的个人自我评价
2014/01/16 职场文书
幸福中国演讲稿
2014/09/12 职场文书
Nginx + consul + upsync 完成动态负载均衡的方法详解
2021/03/31 Servers
Nginx隐藏式跳转(浏览器URL跳转后保持不变)
2022/04/07 Servers
使用ICOM IC-R9500接收机同时测评十台收音机中波接收性能
2022/05/10 无线电