Python Web应用中的模型-视图-控制器(MVC)

2025年1月4日 | 阅读 8 分钟

如果您对 Web 编程感兴趣,您可能已经遇到过缩写 MVC,它代表 Model-View-Controller(模型-视图-控制器)。由于许多 Python 在线框架甚至桌面应用程序都使用它,您可能知道它是一种普遍的设计模式。

但它到底是什么意思?如果您觉得这个概念很难理解,请继续阅读。

本文将教您

  • 通过基于乐高的类比来学习 MVC 模式。
  • 了解概念上的模型、视图和控制器是什么。
  • 将您的理论知识与 Web 开发中的具体实例联系起来。
  • 通过检查 Flask 代码片段来阐明这一点。

也许您是看着乐高长大的,或者您现在仍然是乐高的忠实粉丝。因此,即使您从未将两块乐高积木拼在一起,也请继续阅读,因为这个类比可能仍然是您知识的一个有用的基础。

用乐高解释 Model-View-Controller 模式

想象一下,您 10 岁时坐在客厅的地板上。您面前放着一个装满乐高或类似模块化建筑组件的大桶。有各种尺寸和形状的积木

  • ??? 有些是蓝色的,又高又长。
  • ? 有些是红色的,立方体形状的。
  • ?? 有些是黄色的,又大又宽。

拥有如此多的不同乐高零件,您可以创造出任何东西!

当您的思绪开始涌现各种可能性时,您听到了沙发那边传来的动静。是您的哥哥,他想要某样东西。他说:“嘿!给我造一艘宇宙飞船!”

您对自己说:“嗯,这可能很有趣。”这是一艘宇宙飞船!

于是您开始动手。您开始拿出您认为需要的所有乐高积木。有些大的,有些小的。宇宙飞船的引擎和外壳有不同的颜色。

现在您已经准备好了所有零件,该组装这艘宇宙飞船了。然后,经过几个小时的辛勤努力,这艘宇宙飞船就在您面前了

Model-View-Controller (MVC) in Python Web Apps

您飞快地找到您的哥哥,并将完成的项目展示给他。“干得漂亮!”他赞叹道。然后他沉默地补充道

您能否想象,使用 MVC 设计模式创建一个 Web 应用程序就像用乐高积木搭建东西一样?

用户发送请求

在乐高宇宙飞船的例子中,是您的哥哥提出了制作东西的请求。当用户想要访问 Web 应用程序中的某个特定页面时,他们会通过提供 URL 来实现。

控制器解释请求

在为您的哥哥组装乐高宇宙飞船时,您就是控制器。您编写的代码就是 Web 应用程序中的控制器。

控制器负责理解请求并对其采取行动。控制器负责收集和整理所有需要的构建零件。

模型制作产品

模型是各种各样的乐高积木。您需要不同形状和尺寸的积木来组装宇宙飞船。模型帮助 Web 应用程序的控制器从数据库中检索所有需要的数据来创建产品。

一旦控制器利用模型获取相关对象,构建最终结果所需的一切都已就位。

视图代表最终产品

宇宙飞船是乐高例子中的视图。您的哥哥,那个提出请求的人,只能看到最终结果。

用户在浏览器中看到的页面称为 Web 应用程序中的视图。

总结您的乐高之旅

您已经建造了一艘宇宙飞船,赢得了哥哥的赞赏,并将 MVC 模式与 Web 应用程序开发联系起来。您可以在每次需要提醒自己这个故事与 Web 开发之间的联系时参考这个简短的摘要。

用乐高搭建时

  • 您的哥哥让您建造一艘宇宙飞船。
  • 请求被发送给您。
  • 您收集并整理了建造宇宙飞船所需的所有乐高积木。
  • 您用积木建造了宇宙飞船,然后向哥哥展示了完成的作品。

这些是标准流程。这些可以重复用于创建各种形状和颜色的乐高结构。

现在,您已经将这幅精心着色的画面牢记于心,您可以回过头来将其与 Web 应用程序版本的流程进行比较。

开发 Web 应用时

  • 通过输入 URL,用户希望访问某个页面。
  • 该请求由控制器接收。
  • 控制器使用模型收集所有必需的数据,进行组织,然后将其提供给视图。
  • 视图使用接收到的数据渲染最终网页,并在用户的浏览器中显示。

同样,您的 Web 应用程序会反复执行这些通用操作,为您的客户提供各种页面和信息。

以下是进一步的总结,以表格形式呈现

 乐高网站
愿望哥哥的请求URL 请求
执行控制器
积木乐高型号
可呈现的产品宇宙飞船视图 (View)

做得好!您已将此示例铭记于心,为理解 Model-View-Controller 架构奠定了坚实的基础。然后,您可以进一步深入,从技术角度分析一切,特别是 Python Web 编程。

探索 Python Web 开发中的 Model-View-Controller 模式

当您在浏览器中输入 URL 来访问 Web 应用程序时,会发出访问应用程序中特定页面的请求。但是,程序如何确定要渲染和显示的页面呢?

在创建 Web 应用程序时,您会定义所谓的路由。路由本质上是与不同页面关联的 URL 模式。因此,程序会在后台尝试将用户输入的给定 URL 与预先建立的路由进行匹配。

控制器、模型、视图和路由是这其中涉及的四个主要元素。

路由请求

每个路由都附加有一个控制器。更准确地说,它连接到一个特定的控制器动作,该动作是控制器内部的一个函数。因此,程序会查找与您输入的 URL 匹配的路由。如果成功,将调用与该路由关联的控制器动作。

使用一个简单的 Flask 路由作为示例,您可以开始理解 Model-View-Controller 模式在 Python Web 开发中是如何工作的。

在这里,您定义了 home() 视图函数(本质上是一个控制器动作)与基本路由 (“/”) 之间的关系。当用户请求该基本路由时,您的 Web 应用程序将调用 home()。

用于编码的控制器和模型

通常,您会在控制器动作中执行两个主要操作:

  • 使用模型从数据库中获取所有必需的数据。
  • 视图接收该数据并生成所需的页面。

通常,您会将从模型获取的信息附加到一个数据结构中,例如字典或列表。接下来是将该数据结构发送到视图。

继续将这些功能添加到您的 Flask 示例应用中。

在您修改的视图函数中,第 6 到 8 行是从数据库检索数据。此代码片段中的 get_db() 方法是数据库连接函数的占位符。此函数中的代码必须编写成与您打算使用的数据库兼容,例如 Python SQL 包。

注意:尽管这些示例中的代码理论上演示了 Flask 应用的运行方式,但实际上它本身并不这样运行。您可以通过下载材料存储库来获取一个可运行的 Flask 示例应用,该存储库还包含用于创建交互式 SQLite 数据库的脚本以及所需的 Flask 样板代码。

您将第 8 行生成的列表分配给 entries 变量。然后,第 9 行将列表发送到 index.html 模板,在模板中,一个名为 entries 的变量用于使数据可用。

构建视图

最后,您的视图表示在 index.html 文件中。由于您通过控制器动作将数据结构发送到那里,因此您现在可以在模板文件中访问数据。然后,您可以使用数据结构中的信息来生成用户最终将在浏览器中看到的页面的 HTML 内容。

您可以使用 Flask 示例应用中的 Jinja 语法来循环遍历 entries 并显示每个条目。

如果您数据库中有条目,您的用户将看到所有条目按顺序显示。在第 9 行,您包含了一个可选的 else 子句,该子句在尚未创建任何条目的情况下,会生成一条描述性文本消息。

总结 Model-View-Controller 模式

您现在已经完成了 Model-View-Controller 范式的另一个周期,这一次以 Flask Web 框架(Python)为参考。下面提供了对 MVC 请求过程更全面、更技术性的概述。

  • 通过输入 URL,用户希望访问某个页面。
  • 程序将 URL 与预先计划的路径进行比较。
  • 应用程序调用与路由关联的控制器动作。
  • 控制器动作使用模型从数据库中检索所有必需的数据,然后加载视图,同时发送数据结构。
  • 当视图检索并渲染数据结构时,程序会在用户的浏览器中显示所请求的页面。

虽然这两种方法不完全相同,但也许您可以在为哥哥制作乐高宇宙飞船时识别出它们之间的概念相似之处。

您可以在此处下载代码,以尝试 Flask 示例应用程序并了解使该应用程序正常运行所需的其他代码。

结论

现在是时候告别您玩乐高的过去。您以前往,寻找回忆和比喻,然后您利用它们来加深对 Python Web 应用程序开发中使用的 Model-View-Controller (MVC) 范式的理解。