Django用久了,難免會感覺到自由度不夠。不可否認,這種自由度的犧牲能夠帶來一些好處。比如,一體化的架構(full-stack framework)能夠提供全面的solution,你不需要再為cache,session,feed,orm,auth,template等問題困擾,完全按照Django的設計哲學來使用就可以了。使用Django能夠快速開發應用,而且技術的統一對於團隊開發來說無疑是一件好事,團隊成員無需在技術選型上進行過多的爭論——Django已經幫我們定好了,just DO it。
但是在提供全面的solution的同時,Django將自己打造成了一個封閉的架構。由於所有的組件都靠自己實現,可能在每一個方面都做得不夠好(儘管夠用)。同時為了方便使用,Django的各個組件之間耦合比較緊密,你很難將某個組件替換成你自己喜歡的庫。比如Django最為人詬病的ORM和Template,如果你想替換成SQLAlchemy和Mako,幾乎是不可能的事情。即使勉強使用,也會讓你非常彆扭。
話說天下大事,分久必合。在python web framework 的戰國時代,Django幾乎做到了一家獨大。但如果其他的架構合縱聯合,未必不能與Django一爭高下。
現在這種融合的趨勢已經顯現,而Django如果依然固步自封,即使再強大,也會在曆史的塵埃中銷聲匿跡。如果你不相信,我們可以追索一下事實真相,不難看出這種融合恰恰是從更加強大的Zope的分裂開始的。
在《戲說WSGI》一文中,曾經列舉了幾個python web架構。其中Zope是一個另類,因為Zope非常厚重,適合組織大規模的開發,構建複雜的應用。為了能夠面對更高的複雜度,Zope提供了一個組件架構ZCA (Zope Component Architure),引入了介面的概念,使得複雜系統可以基於介面開發。ZCA提供了適配器組件,用於裝配整個應用的各個組成部分,還進一步提供了可重用的工具組件,事件組件等。可以說,ZCA是Zope中最有價值的產品。
儘管ZCA能夠將Zope提供的認證、對象發布、交易管理、授權等功能組裝起來,但是這些功能在Zope之外還是很難使用。於是有了Repoze項目。Repoze的目標是將Zope的功能組件拆解出來,使得其他的python web應用能夠使用。說到這裡,不禁又要感慨一下WSGI的重要意義:WSGI定義了Web伺服器和Web應用以及Web中介軟體之間的互動協議,只要支援WSGI,各種web伺服器、web應用和中介軟體就能相互對接。而Repoze正是將Zope組件按照WSGI進行封裝,從而遵循WSGI的python web 架構可以很容易使用這些組件。
最初,Repoze推出了自己的一個非常輕量級的web架構:repoze.bfg。在repoze.bfg中利用了ZCA的特性。於是python web framework世界中又多了一方勢力。但恰恰是這個不起眼的小勢力推動了曆史的進程。repoze.bfg和Pylons類似, 幾乎都是完全的策略自由(policy-free),你可以隨意的指定資料持久層,模板系統等外圍部分,而其核心就是約定了URL如何映射到 view 代碼以及如何調用view,在這個過程中完全遵循WSGI規範。後來repoze.cfg的開發人員決定將其合并到Pylons。於是拉開了Python web架構合并的序幕。這個合并的架構叫做Pyramid。無專屬偶,原本基於Pylons的TurboGears也宣布開發基於Pyramid的分支。
至此,混亂的江湖看到了統一的希望,相信越來越多的python web架構會融合,或至少能夠互連。或許,隨著更加開放的架構的出現,Django會慢慢淡出大家的視野,讓我們拭目以待。