本来打算新网站用Ruby on Rails来开发的,结果偶尔看了一篇性能评测,http://wiki.rubyonrails.com/rails/pages/Framework+...,比较了Symfony on PHP,Rails on Ruby,Django on Python三种组合的性能,结合Mysql数据库。结果比较让人吃惊,ROR的性能是PHP的一倍,Django的性能是ROR的一倍。虽然PHP声称框架本身没有问题,是它所使用的那个ORM组件的性能问题,但是,问题就是问题。而且,另外这两套东西所有的组件都是自己的,没得赖,所以,三思之下,放弃了研究了两个星期的ROR,等它再发展一年提高一下性能再说吧。
Django的实现方式跟ROR是比较像的,但是缺少一些方便的地方,比较那么多generate脚本,还有明确的controller,model目录,还有自动的Test,以及Test的时候的数据库维护。
Django基于一个Project作为一个网站,一个App作为其中的一个目录来使用,虽然作者声称这种方式可以让你的App随意插入到另外一个Project里面去使用,但是据我感觉,这个很难做到。除非你的App不涉及任何跟Project相关的东西,比如Session。
每个App有自己的Model和View,它的View跟ROR的View不同,它的View其实是Controller。在Model中定义了表结构以后,在Project的Setting里加入这个App的名字,就可以自动生成对应的表结构。目前它的Model还有几个小问题,One-To-One的实现方式在官方网站上提醒即将发生改变,所以尽量不要用。Many-To-Many的实现跟ROR基本一致,但是它的中间表不是用另外两个表的外键做联合主键,而是增加了一个自动增长的id,通常,这个id是绝对没有用处的。不过由于它本身不支持多字段主键,恐怕目前也没有别的办法了。Django没有数据库连接池,但是看到网上另一篇文章说已经有另一套Python的ORM实现了连接池,目前正在作django的整合工作。也许将来,django的性能还可以再上一个台阶。
第一次使用django的时候,中文乱码的问题一直没搞定,当时用的是ubuntu 6.06 server,这次开发改成了Hiweed 1.0,结果使用的时候就一点问题都没有了,代码里面已经都考虑了数据库UTF-8的问题。django默认的数据库不是mysql,而是postgresql。不过这个数据库我也没装成功,在ubuntu上有很多权限问题。还有看网上的示例代码的时候,代码中出现中文的话,顶上都要加上#coding=utf-8,但是我实际使用的时候不加似乎也没关系。开发工具是eclipse+pydev,整个环境不如RadRails方便,不过有代码提示功能,相当不容易。
实际开发的过程中,需要不停的在Google上查,谁让自己没有Python的底子呢。官方站上的Document基本上都看了一篇,功能还是相当强劲的。Django自己带了一个Amdin,还有User管理,不过看起来应该是个鸡肋。当然了,如果你做的是一个内部使用的文档管理或者联系人管理,或者是一个对外的新闻系统,用用倒是不错的,但是如果开发用户相关的网站,就不灵了,代码还是要自己写。
自带了很多方便的功能,但是我也放弃了很多,比如自动生成并维护Form的代码,如果改用Ajax,就一点也用不上了,包括数据验证。ROR自带了Ajax的支持,但是Django却还没有,只好自己拿Prototype写了。还好,不算太难。没有单元测试(最新的SVN版是有的),但是可以进入命令行调用所有的Model和方法,会有详细的错误提示,也还不至于出现错误的时候没得调试。
django似乎没有执行Update的方法,Delete也只能Get出对象以后再调用,这样子如果是指更新或者删除就比较麻烦了。还好,它留了取Connection的接口,取出Connection以后就可以自己执行任何Sql语句了,可以弥补一些不足。
还有一个很奇怪的设定,每一个Action都需要在Urls文件中加一行对应的定义,目前还不知道能不能使用正则表达式来统一定义,但是没有在文档中看到。这样子每增加一个东西都要去改一次,有点麻烦,而且如果地址很多,每次都要去查询这一套正则表达式,岂不是很费时?看来,作者似乎没打算让人们用它来开发大型应用。单一的应用可能比较容易一些。
目前版本是0.95,已经离1.0不远了,而且整个项目本身就是从一个大型报纸网站的应用上抽象出来的,所以实际的可靠性和性能应该都不是问题。这也是我选择它的一个理由,至少它可以用成熟的apache+mod_python作为服务器,这样比起Apache作Proxy,轮询给后台的十个Mongrel服务器要漂亮的多了。而且,Python上面成熟的模块比Ruby多许多,用起来要方便一些,比如处理图片的PIL。
按照程序员修炼之道的说法,程序员应该每年至少学习一门新的语言,今年就是Python了。等明年再学Ruby吧。原来豆瓣网选择Python也是有相当慎重的理由的。