首先要声明这只是我个人的选择,并不代表它就是正确的,请注意。
Python 是一个很有趣的东西,自由,也有点太自由了,现在已知的 web framework 是非常多的,而这些情况在其它的语言中很少见。记得有人谈起为什么在 Python 中这种情况很容易发生呢(不光是web framework),就是因为 Python 实现这些东西太容易了,这也说明 Python 的生产效非常高。现在就我个人已经了解的 web framework 也已经非常多了,象:snakelets, quixote, webware, Karrigell, CherryPy,还有许多。我真正了解过的可能就是snakelets(由于frog的缘故),cherrypy(许多人研究的缘故,还专门看了不少它的源码,还算比较了解),再有就是现在正学的 Karrigell了。
从我了解的三种 web framework 来讲,我认为snakelet功能似乎更强,它是一个象servlet的一个东西,许多东西已经做好了,象模板,用户认证(提供多种方式)等,只不过没有一个合适的入门教材,而且本身有些复杂,所以一直没有怎么学过。但frog作为一个blog系统我认为是非常好的。不过今天不谈这个了,这里主要是想从我个人的角度比较一下cherrypy和karrigell的比较,也许未必客观。
在前一段时间我写了系列的 CherryPy 的源代码学习的文章,有兴趣的可以找一找看一看。那么给我最大的感受,它的确简单,而且面向对象做得非常好。Karrigell虽然面对象做得不好,但模板功能强,集成数据库,还有一些 CherryPy 目前不提供的功能,各有所长。下面就简单地比较一下:
1. 与web server的集成
两者都有自带web server。都可以与apache集成。但cherrypy是通过反向代理与apache集成,而karrigell是利用mod_python与apache集成,不需要再运行自已的server,与cherrypy不同。
2. 模板功能
CherryPy 自身不带,而 Karrigell 支持 Python in Html, Html in Python 两种方式。当然 Html in Python可能不算一种模板。
3. 编程方式
CherryPy 需要编写类,然后使用cpg.root = A() 这种方式将类的实例与根挂接,从而进行访问。如果有很多类,要自已挂起来才可以。类的方法需要设置是否可以公布的,这样这个方法才可以被外界访问到。方法的参数对应url的条件串(?后面的条件)或表单的变量。
Karrigell不需要挂接处理。写一个.py, .hip, .pih,.ks都是可以的。.py就是普通的python程序,print的结果会作为结果输出。.hip就是Html in Python ,与.py有些象,但在 Python 顶层可以直接以字符串形式写html的代码。.pih就是Python in Html,与其它的 Python Html 模板很象,就是在 Html 模板中嵌入 Python 程序。使用<% %>来包括。.ks就是Karrigell Service,它与 CherryPy 中的方法发布有些象,但不用设置哪个方法需要发布,也不是类的写法,只是函数的写法。一个方法对象一个URL链接,方法的参数与 CherryPy 中的方法处理方式是一样的。
因此Karrigell的方式更简单,也更丰富。
4. 静态文件
CherryPy 的 cpg.root表示一个服务的起始位置,所有的访问都是通过 root 来访问的,而这个root在运行时需要用某个类的实例初始化,这样所有的URL的访问都要经过这个root类的处理。对于静态文件也需要通过这个root来访问,因此在 CherryPy 中为了对静态文件不处理,需要先在配置文件中设置哪些URL为静态文件,这样就不需要做特殊处理。而 Karrigell 没有这个设置,它的root可以是安装目录,也可以在ini配置文件中设置,与类没有关系。这样,只要文件后缀是.html或.htm之类的就是按静态文件进行处理的。比起CherryPy需要设置某个目录,还要进行配置要方便得多。
5. session和cookie
都支持
6. 用户认证
CherryPy 到目前我还没有看到,虽然有 recipe 可以解决这个问题,但不方便。而 Karrigell 已经内置了这个功能,虽然我还没有试过,但 Demo 运行是没有问题的。其中,Karrigell 所带的演示中有一个portal的例子,还提供了web 页面用户注册,认证的示例,并可以保存到数据库中。
7. 数据库
CherryPy 不提供,要自已实现。而 Karrigell 已经集成了一个叫gadfly的数据库,可以用来直接将 Python 的对象pickle到数据库中。而且有人开始建议集成sqlobject模块。
8. 插件
CherryPy 提供,xmlrpc功能就是这样实现的。Karrigell因为学习时间比较短,还没有看到。
9. 资源
CherryPy 学习的人较多,但感觉大部分时间都在完成没有实现的功能,与其它成熟的web framework 相比功能还差一些,只是面向对象要好一些。Karrigell 好象用得人不多,邮件列表人气不旺,这一点与snakelet相似,功能强的东西使用的人也未必多,简单可能更重要吧。不过 Karrigell 也的确简单了。
10. 重定向
就是redirect功能,好象 CherryPy 没看到。而 Karrigell 提供,不过是例用了 Python 的异常功能, raise一个特殊的异常来实现的,很有趣。
11. 其它
Karrigell 提供了方便生成 Html 代码的模块,象 HTML, HTMLTags。还提供了文档保存的功能。还提供了不少的示例,如portal, wiki, calendar, forum等的示例。除了支持gadfly数据库,还支持象mysql, sqlite数据库。Karrigell 还支持语言翻译,现在支持英文和法文。Karrigell 还有Include功能,可以装入其它的文件或脚本。
从以上的比较(可能还不全面)我个人感觉 CherryPy 功能还不是很强,还在发展中。而 Karrigell 功能已经相对强大,使用起来应该更为方便。这就是我选择 Karrigell 的原因。



请问twisted算不算是一个framework呢?
王斌 —— 2005年04月23日 @1:28 pm
有人算,也有人不算。我也搞不清。但它与其它都不一样,因此我个人没有算它。
limodou —— 2005年04月23日 @1:55 pm
Twisted功能太強大了, 在Web這部份若是加上Nevow, 應該算吧…個人覺得它就像是CherryPy的進化版, 請參考http://nevow.com/, 建議下載並看它的範例程式
Kent —— 2005年04月23日 @10:53 pm
当初看到 nevow 的xml的表示方法我就放弃它了。我喜欢象 python 一样的东西,而不是什么别的标准的东西,更何况它并非简单。twisted本身也很大。nevow与twisted结合得很紧密,想做好nevow可能twisted要学得比较好吧。如果改到apache上不知道如何。总之比起karrigell和cherrypy来,有些太复杂了。
limodou —— 2005年04月23日 @11:39 pm
是也乎!
贪图Cherry 的对象树模式,
结果作到最后,发现其 Session 是徦的!
一个实例站点,是通用一个 Session 全局性变量对象的!
即一个人登录后的Session 信息,可以被另一个登录动作所覆盖!!!
呜乎哀哉!
Zoom.Quiet —— 2005年04月24日 @3:34 pm
这个应该不会吧。否则可是一个大bug。
limodou —— 2005年04月24日 @4:47 pm
twisted最近到2.0了,切分为好多模块了。
我自己现在不懂twisted,但是非常向往。社区的大牛们对他评价甚高。
zope3的总设计是jim也是说最想学twisted,另外上次看采访的文章说python的创始人也最推崇twisted和zope3,而且twisted排在zope3的前面。
有空我也要学twisted.
潘俊勇 —— 2005年04月26日 @9:06 am
好,有时间大家一起搞一个twisted的源码学习项目,把学习心得写下来。
limodou —— 2005年04月26日 @9:41 am
CherryPy是带模板功能的,只是后来分开了,需要单独下载.
http://cherrytemplate.python-hosting.com/
CherryTemplate is an easy and powerful templating module for Python. It used to be part of CherryPy but is now released as a separate/standalone module.
Jacob Fan —— 2005年06月21日 @1:57 pm
倒是没有注意。在2.0b看代码时没有看到过这样的说明。包是可以分开,不过对于cherrypy还是完整的好。不过现在怎么样了,我已经好久没关注了。现在重点是karrigell。
limodou —— 2005年06月21日 @4:07 pm
上面的与apache集成部份是不是写错了?我在 http://karrigell.sourceforge.net/en/apache.htm 中没有看到使用了mod_python啊。
youwater —— 2005年06月25日 @5:14 pm
我查了查2.1.5的文档,的确是说不使用mod_python,但我又查了查2.1.2的文档,却是:
To use Karrigell in Apache you’ll need to download and install the following:
* Apache – Web server.
* Mod Python – Plugin for Apache to run Python scripts. Don’t forget to add the lines required in Apache httpd.conf
* Python – Python.
* Karrigell – This!
I recommend you install the latest, stable version of each of the above. Karrigell/Apache was tested/written with Apache 2.0.48, ModPython 3.1.2b, Python 2.3.3 and Karrigell 1.4b on Windows 2000.
下面还有一段就是如何配置的内容,我不贴了。真是奇怪。原来写这篇blog的时候是象我说得一样,但现在可能变了。我在它的邮件列表中问一下好了。
limodou —— 2005年06月25日 @7:46 pm
经过我的测试,按照2.1.2文档来操作的确可以与Apache+mod_python结合,但感到响应慢,好象还有些功能有点问题,已经在它的邮件列表中问了。等待回答中。
limodou —— 2005年06月25日 @11:29 pm
下面是Karrigell的作者给我的关于为什么不使用mod_python的回复:
There was a problem with mod_python. It worked fine on Windows, but on
Linux, Apache works on a multi-process mode, creating different
instances of the Python interpreter. For the scripts that use sessions,
since Karrigell stores them in memory, if a request is handled in a
different process than the previous ones by the same user-agent, the
session object can’t be found
I tried to fix that with persistent sessions but couldn’t come to a good
solution. So I finally decided to drop the mod_python integration and
recommand to configure Apache as a proxy to the built-in server in
Karrigell. This is the approach of many other Python web frameworks
(Snakelets and WebWare for instance)
If you have a Windows machine you can still use mod_python as described
in version 2.1.2, with ApacheHandler
也就是说在windows上你还是可以与mod_python结合。不过我试了好象反应挺慢,有些问题。
limodou —— 2005年06月26日 @3:00 pm
那么多web框架,但是各有所长,都不专业,而且由于数量之多,显得一塌糊涂,感觉都是旁门左道。python为什么不集成一个强一点的?那样就不用去学php了。
could —— 2005年09月13日 @11:17 am
python有强大的呀,那就是Zope。你可以学一学。它是一个强大的企业级应用服务器,而且还自带开发和管理平台。但它并不轻量。如果做大型开发,建议你考虑它。如果做小型开发,自然为了方便,快速,Python可选得就太多了。许多web framework都是轻量型的,因此出于各自的目的就很多。
limodou —— 2005年09月13日 @11:40 am
我很喜欢py就是因为它和其它语言的交互性好,我在windows下面用delphi做界面用py嵌入做一些插件性的扩展性的东西。python4delphi封装了python c api,在delphi中调用py非常方便。
我也知道有zope这个东东,但是一直没有去接触它,可能它太庞大了吧。我觉得py应该在标准类库中集成一个web framework,这样就可以免除使用者到处去找合适web框架的痛苦,而且使用者也不用担心这个框架跟不上py的步伐,文档上面也有保证。
py的db api接口里面定义的接口功能也很弱。
limodou兄主要是做什么开发?好多人都没有那么多时间去学习py啊。
could —— 2005年09月13日 @12:38 pm
Python的标准化的确是一个问题,它虽然已经有一个wsgi的东西,但许多web framework并不按它的标准走。其实别的语言也有许多的标准,更主要的原因是少数大公司的推动。而python更多是程序员个人的东西,开发人员一般就是一两个,也主要是解决自身的问题,因此在标准化、企业化方面做得不够。这种现实问题需要以后Python社区来解决。
至于db_api呢?就目前来说我已经感觉可以了,也因为用得不是太多。
我做系统开发,也是靠业作时间来学习。只不过时忙时不忙而已。关键是坚持。学习Python入门是容易,但要经常用,经常做。因此找上一两个项目,坚持下来。否则时间长了还是记不清了。
limodou —— 2005年09月13日 @12:58 pm
Limodou,why I cannot install CherryPy on Ubuntu platform
overman@ubuntu:~/CherryPy-2.0.0$ python setup.py install
running install
error: invalid Python installation: unable to open /usr/lib/python2.4/config/Makefile (No such file or directory)
will you tell how to resolve the problem,I am a freshman
thank you!
overman —— 2005年09月21日 @12:34 pm
我在hiweed下安装了,没有问题。把cherrypy解开到一个干净目录下安装试试。
limodou —— 2005年09月21日 @2:16 pm
在ubuntu下要先安装python-dev包,才能安装第三方的包。要随时注意ubuntu的包,它把包划的比较小。
xlp223 —— 2005年09月22日 @7:58 am
ubuntu倒是装了一个,但汉字显示让我觉得不好。后来改为hiweed了,不过东西有些旧。正在学习中。。。
limodou —— 2005年09月22日 @8:24 am
怎么用karrigell到底怎么地一个环境,配置;我只知道他是python用来开发web开发的一个环境
ragkk —— 2005年09月24日 @12:26 pm
python比php强大吗?
php能否算动态编程语言,我看了一些介绍,不知道python作为web编程语言有什么优点。
gudai —— 2005年10月19日 @7:18 pm
但是你们这些大牛都在研究python,说明python肯定有其独到的地方,既然是web编程,不知道有哪些网站是用python开发的,要是能看一些实例就好了。
gudai —— 2005年10月19日 @7:20 pm
python当然是比php强大,比较的方面很多,从语言本身:python的面向对象要比php强大得多,如python有名字空间,有包的概念,而php没有。从应用范围python可以做web, gui, 网络,游戏,图形,科学计算等几乎所有领域,如google用它,redhat的安装程序也用它,gentoo的许多工具也用它。而php则局限于web这一方面。
python在web方面内容也非常多,最有名的就是zope了。你去它的主页zope.org上看吧,它的主页就是使用基于zope的另一个著名的cms系统plone来搭建的。国内研究zope/plone最有名的就是czug.org了。它是使用zope/plone来搭建的。另外除了zope,Python还有众多的web框架,国内著名的豆瓣网 douban.com 就是基于twisted(一个著名的python网络平台)+quixote(一个Python的web framework)搭建的。而python下的的还有一些是与ror(ruby on rails)相抗衡的如django和TurboGears,其它的web framework不下几十种,而且各有特色。因此学Python下的web framework会让你眼花僚乱,但的确有学头,而不仅仅只是做东西。
许多东西还要自已去体会,这里只是只言片语,而且我个人体会。
limodou —— 2005年10月19日 @8:49 pm