Flask-framework:MVC模式

I15*_*159 14 python model-view-controller design-patterns flask

Flask框架自然是否支持MVC模式?我应该将应用程序的哪些部分视为模型,什么是视图?什么是控制器?

通常(根据我的经验)Flask应用程序看起来像这样:

main_dir--|
          |
         app1--|
          |    |
          |  __init__.py
          |  api.py
          |  models.py
          |
         static--|
          |      |
          |    all the static stuff
          |
         app.py # with blueprints registering
Run Code Online (Sandbox Code Playgroud)

Zde*_*vic 12

Flask实际上不是MVC框架.它是一个简约的框架,为您构建应用程序提供了很大的自由,但MVC模式非常适合Flask提供的功能.

基本上你编写你的方法并将它们映射到特定的路线,例如:

@app.route("/")
def hello():
    return "Hello World!"
Run Code Online (Sandbox Code Playgroud)

正如您所见,那里没有视图或模型.但是,它也是建立在Jinja2模板库之上的,所以在一个真实的应用程序中,你的方法(充当控制器)看起来像:

@app.route("/")
def hello():
    return render_template('index.html', username="John Doe")
Run Code Online (Sandbox Code Playgroud)

在这里,您使用index.html模板来呈现页面.那是你现在的观点.

烧瓶没有规定任何型号.您可以使用任何您想要的东西 - 从复杂的对象模型(通常使用一些ORM,如SQLAlchemy)到最符合您需求的东西.

你有它:MVC

  • “ Flask实际上不是MVC框架”,我认为这很清楚。现在,关于我的示例:我没有将其称为MVC框架-我写道:“那里有它:MVC”。的确如此,因为MVC模式最初不涉及任何M / V类层次结构,也不需要任何事件或实际类。您正在将MVC模式的非常具体的实现与该模式的一般思想相混淆。MVC框架!= MVC模式。我注意使用适当的名称。 (4认同)
  • 嗯,我第一次读 GoF 的书可能已经过去了大约 20 年,但它仍然没有改变 MVC 不是 GoF 模式之一的事实,所以我对它的熟悉程度完全无关紧要。MVC 模式的含义(与 Smalltalk MVC *实现* 不同)随着时间的推移而变化 - 否则没有 Web MVC 框架适合您的描述。如果你还没有提议在类中包装东西,我看不出类是如何相关的。Flask 模板和 Rails“视图”或 Flask 方法和 Rails“控制器”之间没有本质区别。 (4认同)
  • 嗯...我很抱歉,但不管这是什么,它不是 MVC。也许您打算将“极简框架”表示“根本没有类或实例”。MVC 框架通常包括“模型”和“视图”类的层次结构,并提供使用事件(通常与用户手势相关联)将模型后代的实例与视图后代关联的机制。您在此处提供的示例(我看到的已接受答案)没有这些。因此,它不是(对我而言)任何有意义的“MVC 框架”。这个例子似乎把婴儿和洗澡水一起扔掉了。 (2认同)
  • 听起来我们达成了暴力协议。短语“MVC 模式”很好理解并记录在案,请参阅四人组(“设计模式:可重用面向对象软件的元素”,1995 年)第 4 页。从那时起,该设计模式已在数十个框架中重复使用。也许这是对我们所说的“MVC 模式”的简单误解。“MVC”不仅仅意味着将一个函数称为“模型”而将另一个函数称为“控制器”。关于模型和视图如何受到用户手势的影响,需要进行建设性的讨论。需要比上述更多的东西。 (2认同)
  • 在 MVC Web 框架中,没有通常意义上的用户手势,因此用户手势不是必需的部分。MVC 不是 GoF 模式之一,它只是在那里进行了模糊的讨论。Flask 实际上非常适合这种描述,因为 Jinja 模板确实是模型的“屏幕表示”,而 Flask 方法“定义了 UI 对用户输入的反应方式”。现代(Web)框架中的实现与 Smalltalk 实现有很大不同。当然,您可以在类中包装 Flask 操作和模板。这并不会使其或多或少成为 MVC,因为它与概念/模式无关。 (2认同)