我想以一个免责声明来开始下面的内容。我使用Django开发网站已经有三年了,众所周知,我喜欢Django。我已经写了一个开源的应用程序(app),并且我已经将补丁发送到了Django.然而,我以尽可能以公正的态度写了这篇文章,这篇文章对这个框架有称赞,也有批评。 6个月以前我在大学用Ruby on Rails做 了一个项目而且一直做到现在。我做地第一件事就是仔细地学习了这两个框架并对它们进行了比较,但是我记得当时我很泄气的。当我寻找这些问题(比如说:”对 于这两者来说,数据库的迁移是如何操作的?“、”它们的语法有什么区别?“、”用户认证是如何做的“)的答案时,我站在一个较高的角度比较了两者,发现它 们大部分是非常肤浅的。下面的评论将会回答这些问题并且比较每个web框架是如何操作模型、控制器、视图、测试的。 简要介绍两个框架都是为了更快的开发web应用程序和更好的组织代码这两个需求应运而生的. 它们都遵循 MVC 原 则, 这意味着域(模型层)的建模,应用程序的展现(视图层)以及用户交互(控制层)三者之间都是相互分开的. 附带说明一下, Django 实际上只考虑了让框架做控制层的工作,因此Django 自己声称它是一个模型-模板-视图(model-template-view)框架. Django 的模板可以被理解为视图,而视图则可以看做是MVC典型场景中的控制层. 本文中我将都是用标准的MVC术语. Ruby on Rails
Ruby on Rails (RoR) 是一个用 Ruby 写 就的web开发框架,并且Ruby“famous”也经常被认为是归功于它的. Rails 着重强调了约定大于配置和测试这两个方面. Rails 的约定大于配置(CoC)意味着几乎没有配置文件, 只有实现约定好的目录结构和命名规则. 它的每一处都藏着很多小魔法: 自动引入, 自动向视图层传递控制器实体,一大堆诸如模板名称这样的东西都是框架能自动推断出来的. 这也就意味着开发者只需要去指定应用程序中没有约定的部分, 结果就是干净简短的代码了. DjangoDjango 是一个用 Python 写成的web开发框架,并以吉他手 Django Reinhardt 命名. Django 出现的动机在于 "产品部密集的最后期限和开发了它的有经验的Web开发者他们的严格要求". Django 遵循的规则是 明确的说明要比深晦的隐喻要好 (这 是一条核心的 Python 原则), 结果就是即使对框架不熟悉的人,代码都是非常具有可读性的. 项目中的Django是围绕app组织的. 每一个app都有其自己的模型,控制器,视图以及测试设置,从而像一个小项目一样. Django 项目基本上就是一个小app的集合, 每一个app都负责一个特定的子系统.模型(Model)让我们先从看看每个框架怎样处理MVC原则开始. 模型描述了数据看起来是什么样子的,并且还包含了业务逻辑. 创建模型Rails 通过在终端中运行一个命令来创建模型.
该命令会自动生成一次迁移和一个空的模型文件,看起来像下面这样:
由于我有Django的技术背景, 令我很生气的一个事实就是我不能只通过模型文件就了解到一个模型有哪些字段. 我了解到Rails基本上只是将模型文件用于业务逻辑,而把模型长什么样存到了一个叫做 schemas.rb 的文件中. 这个文件会在每次有迁移运行时被自动更新. 如果我们看看该文件,我们可以看到我们的 Product 模型长什么样子.
在这个模型中你可以看到两个额外的属性. created_at 和 updated_at 是两个会被自动添加到Rails中的每个模型中的属性. 在 Django 中,模型被定义到了一个叫做models.py的文件中. 同样的 Product 模型看起来也许会像下面这样
注意,我们必须在Django中明确的(也就是自己手动的)添加 created_at 和 updated_at 属性. 我们也要通过auto_now_add 和 auto_now 两个参数告诉 Django 这些属性的行为是如何定义的. 模型(Model)字段默认值和外键Rails将默认允许字段为空。你可以在上面的例子中看到,我们创建的三个字段都被允许为空。引用字段类别也将既不创建索引,也不创建一个外键约束。这意味着引用完整性是无法保证的。Django的字段默认值是完全相反的。没有字段是被允许为空的,除非明确地设置。Django的ForeignKey将自动创建一个外键约束和索引。尽管Rails这里的制定可能是出于性能的担忧,但我会站在Django这边,我相信这个制定可以避免(意外)糟糕的设计和意想不到的情况。举例来说,在我们的项目中以前有一个学生没有意识到他创建的所有字段都被允许空(null)作为默认值。一段时间后,我们发现我们的一些表包含的数据是毫无意义的,如一个使用null作为标题的轮询。由于Rails不添加外键,在我们的例子中,我们可以删除一个持续引用其他产品的类别,这些产品将会有无效引用。一种选择是使用一个第三方应用程序,增加对自动创建外键的支持。 迁移(Migrations)迁移允许数据库的模式(schema)在创建之后可以再次更改(实际上,在Rails中所有的内容都使用迁移,即使是创建)。我不得不敬佩Rails长期以来支持这个特性。通过使用Rails的生成器(generator)即可完成工作。
这会向Product模型(model)添加一个名为part_number的新字段(field)。 然而Django只能通过名为South的第三方库来支持迁移。我感觉South的方式更加简洁和实用。上面对应的迁移工作可以直接编辑Product模型的定义并添加新的字段
然后调用
South会自动识别到一个新增字段添加到Product模型并创建迁移文件。随后会调用下面命令完成同步(synced)
Django最终在它的最新版本(1.7) 将South整合进来并支持迁移。 执行查询感谢对象关系映射(object-relation mapping),你不需要在任何框架中写一行SQL语句。感谢Ruby表达式,你能够很优雅的写出范围搜索查询(range query)。.
这会查询到昨天创建的
Django完成的方式不是太好,但以我的观点,却更加简介。在Django对应的代码如下:
控制器(Controller)控制器的工作就是利用请求返回准确的应答。网络应用程序典型工作是支持添加,编辑,删除和显示具体的资源,而RoR的便捷表现在使开发控制器的工作简单而贴心。控制器被拆分为若干个方法(method),每个方法代表指定的动作(action)(show代表请求某个资源,new代表显示创建资源的表单,create代表从new接收POST的数据并真正的创建资源)。控制器的实例变量(以@为前缀)会自动被传递给视图(view),Rails从方法名称就会识别应该把哪个模板(template)作为视图。
|