Python技术迷

python面试题:什么是MVC/MTV模式?

我们组的小李问我,"哥,你能不能给我讲讲那个MVC跟MTV到底啥区别啊?"我当时一边啃着外卖汉堡一边跟他扯,没办法,年轻人问题还挺多。其实这俩东西,说难也难,说简单也真挺接地气的。

MVC 模式到底啥意思?

你别看网上说得高大上,什么模型-视图-控制器,我跟你讲实际开发就三件事儿。比如咱们用 Python 写个 Web 应用——你写个博客系统对吧,你肯定得有数据、有界面、有逻辑。

  • Model:就是那个,数据库那一层,比如有个 User 类,对应你数据库里的 users 表。
  • View:就是你看到的页面,比如你访问 /users/1,弹出来一个用户详情页面,那页面其实就是 view。
  • Controller:这个其实我一开始也懵,后来一想就是接收请求、处理数据、返回响应的那坨代码。比如 Flask 里那个路由函数:
@app.route('/users/<int:user_id>')
defuser_detail(user_id):
    user = User.query.get(user_id)  # 这就是Model层
return render_template('user_detail.html', user=user)  # 这就是View层

你看其实控制器就是负责"协调"的,收请求-查数据-返回页面。这个流程想明白了,MVC也就明白了。

MTV 又是啥玩意?和MVC一回事吗?

说实话,这名字一换我最早也被绕晕了。Django 最爱搞这个,MTV 其实和 MVC 只有一点点名字的差别,思想上没啥区别。

  • Model:还是老样子,操作数据库那部分,比如 Django 里你写 models.py。
  • Template:这个就等于 MVC 里的 View,就是你网页的模板文件,什么 {{ user.username }} 这种。
  • View:你别看叫 View,实际上它干的是 MVC 里 Controller 干的事儿——接收 HTTP 请求,调 Model 查数据,然后用 Template 拼成页面给前端发过去。

就比如说,Django 里有个 view 函数:

defuser_detail(request, user_id):
    user = User.objects.get(id=user_id)  # Model
return render(request, 'user_detail.html', {'user': user})  # Template

你瞅见没,这里的"View"其实不是"页面",而是"处理请求"的逻辑,跟 Controller 一毛一样。Template 才是你真正在浏览器里看到的界面。

那到底有啥用啊?

这个问题我那天在地铁站回家的时候还跟同事唠过,就是让你的代码别太乱。比如你写一个功能,你不能啥都往一块写,查数据库、渲染页面、业务逻辑全混一起,以后维护真的是要命。所以像 MVC/MTV 这种分层设计,目的就是让每一块都清楚、互不影响。

有一次我们组做那个用户资料修改,有同事在 Controller 里直接写了 SQL,最后查 bug 查得大家头都大,后来把代码拆成 MVC,Model 负责查库,Controller 只负责流程,View 负责展示,后面真省了不少事儿。

其实你要真问我,MVC/MTV区别真没多大,都是分层设计,把数据和页面和逻辑分开,各司其职,代码看着清楚,将来改也方便。Django 搞个 MTV 就是换了个壳,心里不用太有压力,你记住"分工明确"就完了。

对了,最后再唠两句,你要是用 Flask 那 MVC 就特别好理解;用 Django 记得 View 其实是 Controller 的活儿,Template 才是页面。 再比如说,咱们如果写个登录页面,Controller/View 里做用户验证,Model 查数据库,Template 展示页面,结构一下子明白了。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领