本來打算新網站用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也是有相當慎重的理由的。