有人經常問技術專家Arun Ravindran,Django是否支持單頁面應用或事件驅動型架構。起初,他認為開發實時應用,服務器端有多種方案可選,前端可以采用JavaScript MVC框架。其中Django可用于服務器端的開發。但當Arun Ravindran了解到Metero,并對它進行嘗試后,他的看法改變了。他認為Metero具有強大的力量,可以徹底改變現在的Web開發。傳統Web框架(如Django)是否真正適合開發實時Web應用?Arun Ravindran為此專門寫了一篇文章《Real-time Applications and will Django adapt to it?》,文中對Django和Metero進行了對比。
下面是CSDN對該文章的簡譯。
什么是實時應用程序?
實時應用程序通常被稱為Ajax應用、單頁面應用。除此之外,很少人再提及“無需刷新即可提交表單”這一點了。在處理某件事上,服務器將數據推送到瀏覽器端,并可同時實現服務器和瀏覽器間的雙向通信。
此類應用可以給用戶一種“活生生”的感覺,而不像傳統網站,在加載完后顯得很呆板。打個比方說,傳統網站就像烹飪好的飯菜,會隨著時間的推移而腐爛,而實時網站就像活生生、會呼吸的有生物,始終保持著與環境的交互。
實時適合哪種類型的網站?
事實上,任何類型的網站都可從實時更新中獲益。下面特別列出了幾種類型的網站,實時對這些網站尤其重要。
當然,也有一些類型的網站并不適合作實時更新,如包含大量靜態內容的博客、維基。設想一下,如果一個博客網站在運行期間,不斷詢問博文的更新情況,它瞬間就會如種病毒般崩潰。現在最優的解決方案是,預先計算并緩存文章的內容,在更新評論內容時,可采用Disqus以創造一種幾乎完全實時的體驗。但不久我們可能會看到,這種方法會隨著Web基本特性的改變而發生改變。
Meteor適合開發實時Web應用嗎?
Meteor、Derby號稱新一代Web應用框架,可用來構建實時Web應用。這些框架由JavaScript編寫而成,開發者不必在客戶端和服務器端分別編寫相同的邏輯程序。將JavaScript作為服務器端編程語言,其好處在于可使數據架構和邏輯程序在前后端共享,而不必用兩種不同的語言再分別寫一遍。
這兩種新的框架也可實現數據庫的自動同步。換言之,服務器和所有相連的客戶端可同時自動復制服務器上的部分和全部信息。自動同步數據庫信息,可幫助你快速實現實時Web應用。
實時Web框架工作流程示意圖
盡管如此,開發者很可能面臨互聯網帶來的其他各種挑戰,如很慢的移動網絡連接,甚至是服務器宕機。而用戶一旦看到“失去連接”的提醒,往往會失去工作思路。如果整個網站反應遲鈍,用戶就會產生厭惡情緒,所以開發者在開發所有功能時不要完全依賴于數據同步機制。
Django適合嗎?
與Meteor相比,利用Django或Rails,在服務器端,模型聲明和行為必須使用Python、Rails編寫,而在客戶端則需要針對MVC框架(如AngularJS或Knockout)再利用JavaScript重新寫一次。服務器與客戶端共享的邏輯部分,是開發者、維護者的一場惡夢。
實時Web開發,是Django面臨的真正挑戰。雖然Django提供了一些不錯的解決方案,如用Gevent運行Django,但在與綜合性的解決方案(如Meteor)相比,它更像黑客技術。
Django,適合開發實時Web應用嗎?回答此問題之前,我們先看看Django有哪些不足。
模板已不再是必需的
確切地說,HTML模板的使用越來越少。內容通常在客戶端渲染,之后數據以XML、JSON形式進行傳輸。在Django最初創建時,所有的客戶端并不支持使用JavaScript進行客戶端渲染。但隨著移動客戶端的強大,該解決方案正發生著迅速變化。
這并不意味著,該框架中已不需要模板。如XML和JSON模板,Python數據結構仍需映射到JSON,并以簡單方式進行傳輸(與JavaScript很像)。
但Django的早期解決方案,如Piston、DjangoREST,并沒有直接采用Python數據結構,很重要的一個原因是安全性。來自外界的數據并不可信,你需要定義相應的類進行基本的數據檢驗。從本質上說,你可能需要再編寫一次已在前端完成的模型類。
HTTP和WSGI接口
如果仔細觀察上文提到的幾種類型網站,你可能注意到一些網站需要不斷更新少量數據,這種類型的網站更適合做成實時網站。像包含長篇幅內容的網站,如博客、維基甚至新聞類網站,可能更適合采用傳統Web框架。
WSGI為同步協議,一次只能解決一個請求,因此不太適合創建實時應用。Django在服務器端部署時采用WSGI接口,這意味著該機制上不適合使用異步代碼。
這似乎是Django的真正缺點。可能會有黑客圍繞這一點進行攻擊,如頻繁地進行輪詢等。如果該框架可以與異步模式相結合的話,情況就會好很多。
現在,使用Django編寫基于REST的API,利用JavaScript MVC庫實現與它的交互,成了創建單頁面應用的流行方法。讓它實時更新,還需要圍繞Gevent或Tornado和Web Sockets做一些工作。
結論
對于大量Web應用來說,Django是一個很優秀的解決方案。但隨著實時更新需求的高漲,實時Web應用需要現有的Web框架做出相應改變,如Django。現在的解決方案需要大量組件,有時還需要重復編寫相同代碼。像Meteor和Derby新一代解決方案可以很好地滿足這些需求,并能進行快速開發。但實時應用的設計和可擴展性依然不太理想。(編譯:陳秋歌 審校:張紅月)
本文內容來自:Real-time Applications and will Django adapt to it?