学习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就对了