學習Flask的過程中,有一個一直困擾我的問題,即其設計模式是否為MVC?
之所以有這個困擾,因為首先我看的兩本書,《Flask Web開發:基於Python的Web應用開發實戰》和《Python Web開發實戰》,都沒有相關章節
但在不少相關開發/技術支援的招聘資訊裡,確要求對其要理解掌握
在實踐過程中,我一度也以為自己理解了model和view的概念(當時以為就是對應models.py和views.py),但找不到controller所對用的物件,於是花了大概半個下午查閱了一些文件,在此,我也以自問自答的形式,把找到的資料也心得羅列一下
MVC是什麼?
從維基百科或阮一峰的文章中可以瞭解到,MVC是一個軟體工程中的設計模式,除了MVC之外,還有MVP和MVVM等模式
這裡我沒有思考到客戶端和服務端的區別,也給一開始理解給挖了坑
這個坑,在最後一個答案裡提到的文章中有解答:
- “服務端接收到來自客戶端的請求,服務端通過路由規則把這個請求交由給特定的Controller進行處理,Controller執行相應的應用邏輯,對Model進行操作,Model執行業務邏輯以後;然後用資料去渲染特定的模版,返回給客戶端。
因為HTTP協議是單工協議並且是無狀態的,伺服器無法直接給客戶端推送資料。除非客戶端再次發起請求,否則伺服器端的Model的變更就無法告知客戶端。所以可以看到經典的Smalltalk-80 MVC中Model通過觀察者模式告知View更新這一環被無情地打破,不能稱為嚴格的MVC”
Flask,其預設採用MVC嗎?
我一開始找不到好的文章能回答這個問題,所以就去了解了下Django的預設設計模式
看到有兩種說法,分別是MVC和MTV,在查閱更多文章後,發現其實兩者是一回事兒,官方都在FAQ中提到了這點
OK,那麼再對比一下Django和Flask(的預設設計模式)就可以知道答案了
對比後,答案是否定的,因為Flask可以採用MVC,也可以不用(比如7行程式碼實現Hello World網頁,根本就沒有Model)
另外,在《Flask Web開發:基於Python的Web應用開發實戰》這本書裡,是採用了MVC進行教學的
MVC及其衍生的各類設計模式的定義和優缺點是什麼?
很幸運地,我在這篇文章裡找到了大部分解答,這裡不再複述
其中MVC Model 2的部分,令人茅塞頓開
“服務端接收到來自客戶端的請求,服務端通過路由規則把這個請求交由給特定的Controller進行處理,Controller執行相應的應用邏輯,…”
結合剛才官方FAQ裡的”Django appears to be a MVC framework, but you call the Controller the “view”,…”
可以看到,把那些個views.py理解成controller就對了