金字塔(Pyramid): 金字塔/Python框架中相当于MVC的东西?

12

Pyramid/Python框架中,有哪些类似于PHP框架(比如Kohana)的 Model-View-Controller(MVC) 架构?

In Pyramid "Model" is .... and it is used for .....
In Pyramid "View" is .... and it is used for .....
In Pyramid "Controller" is .... and it is used for .....

我正在尝试理解Pyramid的逻辑。作为答案的补充,任何帮助、文档等都将不胜感激。

谢谢。

4个回答

21
Pylons是两个框架之一,它与repoze.bfg合并形成了Pyramid。Pylons与MVC系统很接近,但是关于MVC的定义已经引起了许多争论。因此,许多曾经自称为"MVC"的项目现在开始称其为"MTC"(模板模型控制器)、「MT」(模板模型)或「MV」(模型视图)。虽然关于"model"的定义大家都认可,但是关于“view”和“controller”在给定框架上映射到什么地方可能会引起争议。
Pyramid和Pylons都有一个“dispatcher”功能来设置请求的映射。在Pylons中,它在config/routes.py中;在Pyramid中则略有不同--默认的脚手架将路由设置在app/init.py中,但您可以自由地将其拆分成app/routes.py或使用config.include()将其推入“handlers”或使用config.scan()从“views”中提取它。
在Pyramid中,“handlers”由Pyramid_handlers提供,实际上只是具有许多自动生成内容的“views”。如果您愿意,在您的应用程序中可以同时使用handlers和views(我的应用程序就是这样)。
总之,根据您对MVC/MTC等的解释方式,下表展示了您可能所需内容的概览:
           || mvt            | mvc            | mvc
==========================================================================
model      || sqlalchemy     | sqlalchemy     | sqlalchemy
view       || views/handlers | templates      | views/handlers + templates
controller ||                | views/handlers | dispatch/routing
template   || templates      |                |

快速说明 - 我定义上述内容并不是基于我的解释或'官方' MVC 定义...而是根据其他流行框架的市场定位。


11
如果需要,Pyramid可以模拟MVC模式:
  • Model:例如使用SQLAlchemy( http://docs.sqlalchemy.org)
  • View:使用模板和视图方法。
  • Controller:你可以使用Pyramid_handlers包,创建控制器并将在路由中定义的操作映射到控制器中的操作,例如:
   类HomeController(object):
     def __init__(self, request):
          self.request = request
def form_proc(self): name = self.request.params['name'] ... bla,bla,bla...

在配置文件中你可以添加如下内容:

    config.add_handler('home', '/home/{action}',
                       handler='mypackage.HomeController')

如果你将此URL放入表单操作中 ->http://SERVER_NAME/home/form_proc,你可以处理表单。

如果需要,Pyramid会为你提供所有的灵活性。


5
Pyramid Introduction中可以看出:
你说Pyramid是MVC模式,但控制器在哪里?
Pyramid的作者认为MVC模式并不适用于Web。在Pyramid应用程序中,有一个资源树,它代表站点结构和视图,这些视图通常呈现存储在资源树中的数据和用户定义的“领域模型”。然而,框架提供的任何设施都不一定映射到“控制器”或“模型”的概念。因此,如果你必须给它一个缩写词,我想你会说Pyramid实际上是一个“RV”框架,而不是一个“MVC”框架。“MVC”,然而,作为与其他Web框架比较的一般分类标志足够接近。

你好,我已经阅读了他们网页上的所有内容,甚至查看了示例,但我仍然不理解。因此,我寻求另一位PHP开发人员的解释,希望能用我提出的问题来解释,以便我能够理解。谢谢。 - Phil
但是Pyramid的开发人员告诉你,这里没有直接的类比。为什么不相信他们呢? - Wilduck
1
不,我确实相信他们。Python的人非常友好。我只是想了解背后的逻辑。例如,在Kohana中,它很简单。定义URI,从URI触发控制器,告诉控制器要做什么,例如使用模型类进行DB调用,然后包括一个或两个模板,混合两者创建-渲染响应并将其发送回来。我只想知道如何使用Pyramid完成此过程。我真的非常喜欢Python的语法,想要深入学习。谢谢。 - Phil
Phil:我从没有使用过Kohana,但是你所定义的正好与Pyramid的方式相同。你的问题似乎是要求将Pyramid的各部分映射到“Model”、“View”和“Controller”部分。Wilduck已经展示了文档,其中Pyramid的创建者认为这种准确映射是不可能的。如果你仍然感到困惑,也许你应该重新表述你的问题,更具体一些,因为现在的问题似乎真的无法回答。 - Mark Hildreth

2
我有使用过CakePHP的经验,现在开始学习Pyramid和Python。 虽然Pyramid并非采用奇怪的方式处理问题,但由于框架作者滥用MVC术语,所以这两个框架并没有直接的对应关系。
例如,在Cake中,有一些类被称为“Models”,但大多数时候它们只是ORM类。控制器主要用作相关方法的命名空间,这些方法被称为“actions”,将数据传递给视图,而视图只是模板。
按照Pyramid的术语,'Resources'相当于'Models',您可以在此处自由使用任何东西,如果需要ORM,则可以使用SQLAlchemy或mongodb等。框架本身充当'Controllers',而'Views'则称为'Actions',可以是普通函数或类,您可以随意组织它们。这些视图可以使用模板和渲染器来构建响应,并发送到浏览器。
希望它能有所帮助(请原谅我的糟糕英语)。

非常感谢您的友善回答。如果您不介意,我想再问您几个问题。在 PHP(一般情况下),您需要解压文件,将它们放入一个文件夹中,然后通过 Apache+PHP 运行它。在 Python 中,我很难理解这是如何工作的。每个文件夹是否都被视为一个“应用程序”?Web 服务器如何托管多个 Python 网站?WCGI 有什么用处?我想学习 Python,但涉及到 WCGI 和所有这些命令行工具似乎很复杂。 - Phil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接