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會慢慢淡出大家的視野,讓我們拭目以待。