我要提前警告你,我是一名 Django 开发人员,对 Rails 的开发保持适度的关注,而且我从来不需要开发或维护复杂的 Rails 应用程序,所以我将专注于鉴于 Django 的优势以及我对 Rails 设计理念的了解,因此我欢迎有经验的 Rails 用户挑战和纠正我即将做出的任何错误假设。
哪一个更适合快速且可维护地开发复杂的 Web 应用?
Django 有一个奇妙的模块化层,它是通过 Django 应用程序实现的。您的项目只不过是一个由根 URL 配置和设置文件组成的 Django 实例,其主要目的是将 Django 应用程序连接到您的实例中。
Django 应用程序本身是 Python 包,由 Django 设计,旨在打包以完全独立于 Django 实例进行分发,这就是我最初选择 Django 的原因。它们封装了提供特定功能所需的所有离散组件(模型、模板、URL 模式、视图、表单等)(此应用程序支持用户注册;该应用程序提供用户身份验证;这个用于管理用户配置文件;这个一个服务器动态地从数据库中获取静态页面;这个应用程序可以获取任何图像,将其转换为 RGB JPEG,调整其大小并将其上传到本地路径、S3 或某些 FTP 服务器),并且鼓励您拥有许多不同的 Django应用程序来简化您的应用程序结构。
坦率地说,在 Rails 中,您的应用程序就好像完全由单独的 Rails 插件组成。 Rails 架构鼓励人们拥有一个巨大的app/ 结构,其中一个功能的所有组件都保持独立并与来自其他功能的类似组件并置在一起,并将第 3 方代码与他们的 Rails 应用程序一起分发到vendors/,而 Django 强制 Django 应用程序是肩并肩的顶级包,无论是您的实例特定应用程序还是第 3 方应用程序,它们可以在同一环境中的多个 Django 实例中独立重新分配和重用,完全封装数据夹具,它们的拥有自己的模板、静态媒体、翻译、测试代码、模型、视图和控制器及其中间组件。
例如,看看这两个大项目的存储库,Zamboni 和 Redmine。 Zamboni 的所有application code 都驻留在几十个 Django 应用程序中,只需阅读每个应用程序的包(文件夹)名称,您就可以清楚地看到它们记录了 Web 应用程序的某些部分(功能)所在的位置以及所有相关代码该功能被封装在应用程序中。将其与Redmine 进行比较,其中一个功能的组件保持独立并与预定义目录中的其他组件混合。当您探索或开发 Redmine 的 Wiki 功能时,您必须在不同目录内和不同目录之间进行大量导航,这使得全面了解 Wiki 功能提供的所有内容变得更加困难。
这只是我个人的看法,认为 Django 在开发和维护大型代码库方面具有更好的架构前提。
是否有人认为 Rails 应用程序比 Django 应用程序更漂亮?
据我所知,抛开个人喜好不谈,两者都有简洁的建筑设计。如果您遵循惯例并采用与您的框架相同的模式来解决类似问题,那么您的应用在其他框架开发人员眼中应该看起来和感觉都很漂亮。
所以这部分也回答了人们所说的关于 Rails 学习曲线困难的观点,我相信这对 Django 也是如此。两者都有一个困难的学习曲线,因为它需要时间来理解框架的基本理念和设计,以设计和开发与框架相匹配的漂亮应用程序,而不是反对框架。我所说的美观是指很自然地发现某个功能的实现位置,或者更离散地,它是数据、表示和行为,并且应该在哪里添加新功能以及它们如何与现有组件交互是非常明显的。
但是,除非您对自己的框架没有充分的了解以完全理解它,否则您很可能会采用新颖的方法,为其他开发人员广泛配置和定制框架体验。我认为您在 Rails 和 Django 中可能犯的唯一新手错误是做一些可行的事情,但设计非常脆弱且不直观,这要么以不合时宜的方式违背记录和证明的方法,要么忽略基本框架原则。
一个比另一个更容易部署吗?
不,两者都提供了便于打包和部署的工具。有很多 Ruby 和 Python Web 服务器在野外,使部署变得轻而易举,尽管我可以看到大多数人仍然为 Apache 部署他们的应用程序,这对于可能仅用于与您的 Rails 或 Django 应用程序进行实例化和交互,所以我知道一些痛苦来自哪里。
哪个数据库库/ORM更好?
Rails 和 Django 在对数据库模式的理解上存在分歧。 Rails 获取您现有的架构并将其映射到应用程序逻辑,而 Django 获取您现有的应用程序逻辑并将其映射到架构。两者都从未阻止任何人构建复杂的应用程序。
在 Rails 中,您的模型从模式中冒出来,而在 Django 中,您的模式从模型中冒出来。我在任何地方都没有发现这一点,但它让人想起裸对象模式,即域对象属性不仅仅是哑数据持有者。模型 API 有助于全面了解您的数据,因为每个模型字段都是复杂、可重用和可自定义的字段类的实例,它提供业务逻辑和数据表示。实际上,Django 模型可以提供复杂的继承场景、它们的模式、管理阻抗不匹配,并提供通过 HTML 表单和管理后端填充模型数据的表示。
Rails 中的脚手架几乎是一次性的,它可以提供基本的 CRUD,直到您提供自己的复杂表示和行为。 Django 的管理员可以内省您的模型,并动态地提供一个精心设计的界面来管理您的模型数据,这些数据可以通过ModelAdmin 对象进行广泛定制。即使您永远不会为非员工用户提供对管理后端的访问权限,并且始终必须在您的网站前端演示文稿中为其他社区用户设计 CRUD 访问权限,但您将始终使用它来为用户提供对数据的访问权限具有提升的权限。基本上,您可以用几行代码描述一个模型,并拥有一个成熟的、生产就绪的界面来管理您的领域对象。
模型是任何数据、表示和行为三元组的焦点,使开发复杂的应用程序变得非常容易。说实话,由于 Django 的模型更加明确,因此定制应用程序对其模型数据的假设变得更加困难。在您开始使用 3rd 方 Django 应用程序之前,这永远不会成为问题,因为一旦他们发布了一个模型,上面写着一个城市的名称只能是 72 个字符长,您就会坚持下去。 Django 在即将发布的当前预览版中提供基于类的通用控制器,它应该为在控制器级别自定义模型交互提供更清晰的界面。这应该可以快速简化人们如何扩展和覆盖 3rd 方应用程序的逻辑以抽象关于模型数据的假设。
结论
坦率地说,我只是看不出你怎么会出错。 Rails 无疑是目前更广泛的开发人员社区中更受欢迎的选择,但我相信这应该是一个纯粹的个人选择,取决于你作为开发人员从一个开发者那里获得的快乐程度。 .在这一点上,他们的设计和功能集已经足够成熟,可以用两者来做任何你需要的事情,无论你如何完成它。
这可能只会让您不得不判断人力资源和第 3 方解决方案库。尽管您可以找到比 Ruby 开发人员更多的 Python 开发人员,但您肯定会找到比 Django 开发人员更多的 Rails 开发人员。到目前为止,Django 已经引起了足够的兴趣,您可以找到一个 Django 应用程序来满足您的任何需求,Rails 已经更成熟了;就语言而言,您还可以在 Ruby 中找到您需要的任何东西的本地解决方案,这是 Python 更成熟的东西。我认为您在做出选择时可以安全地排除原生和框架 3rd 方解决方案。