Django-like 框架模式

11

我使用 Django 已经很多年了(从 Django 1.2 开始)。过去,我也使用过不同类型的 web 框架(例如 CakePHPRailsASP.NET MVC 和其他一些全栈框架),Django 并不是我的第一个框架。

不同的框架在它们的方法和优点上存在差异。我喜欢其中的一些方面,也不喜欢其中的一些方面。在这个背景下,我想更详细地研究 Django 框架的设计。

转向 Django 后,我喜欢它如何设计框架。当学习一种新语言(比如 Go、Scala、Ruby、Haskell)时,我会尝试寻找一个在设计上有一些相似之处的框架,特别是后者提到的那些。

以下是两个 Django 框架设计决策的主要区别:

  • 它鼓励可插拔应用程序应用程序可重用性。因此:
  • 它使用模型-视图-模板(MVT)而不是传统的 MVC:
    • FAQ中提到。
    • 视图描述呈现哪些数据
    • 模板描述数据如何呈现
    • 视图通常委托给模板
    • 控制器可能是框架本身:根据Django URL配置将请求发送到适当的视图的机制。
    • 我不相信Django开创了这样的特性。我相信这种模式在框架设计中非常常见。只是我不知道这个(设计)模式叫什么?这个概念很有用,可以应用于其他框架。我相信知道模式的名称可以帮助我理解甚至建立一个具有相同概念的不同语言的新框架。

      目前有大量的Web框架,其中大多数都遵循经典的MVC模式。一些使用插件的概念来添加特定的功能。然而,插件解决了依赖于上下文的不同方法的可重用性问题。

      所以我尽可能学习了许多框架,以便找到不同语言的替代框架。希望我能找到Django使用的模式。但是,对我来说学习所有这些框架非常困难。事实上,到目前为止我还没有找到一个。

      我一直在寻找:

      不幸的是,它们中没有一个真正强调我感兴趣的概念。

      在这个问答中,我想知道人们如何称呼这样的框架?(或Django使用了什么模式?) 如果您能提供参考,说明其他框架可能也在使用该设计,那就太好了。


不要陷入这种逐字比较的误区。事实上,我也一直在寻找这种模式,但我发现并非每种编程语言都能像另一种语言一样提供相同的体验和表达能力。PHP与Ruby不同,Scala与Go也不同。它们的框架也会有所不同。Django是独一无二的。 - Fanis Despoudis
@FanisDespoudis,我同意我们不应该寻找单一的框架真理,不同的框架具有不同的能力。它们在不同的领域中也能更好地发挥作用。只是这个问题是为了学习模式,以便我们可以将其应用到不同的领域。 - Yeo
我不确定为什么那些投票反对者要反对这个问题。希望我们不要比较哪个框架更好,而是从不同的框架中学到什么。 - Yeo
1
问题过于宽泛,且主要基于个人观点。 - dnozay
3个回答

2

查看Django设计哲学

我认为他们使用/结合了许多不同的设计模式,试图实现这些哲学。很难映射到单一的概念。

提示是查看软件设计模式,应该能够识别在Django中使用的许多模式。当然,许多模式在其他框架中也很常见。

例如(更或少使用的模式):

  • modelform_factory 映射到“Builder”
  • QuerySet 可以映射到“惰性初始化”
  • ORM/数据库映射到“适配器”

感谢您提供了一些设计模式在Django内部不同部分中应用和映射的示例。我已经在您的示例中包含了一些对Django源代码的参考。 - Yeo

1

django有什么其他语言没有的特点呢?

  • 是访问数据库或模型吗? - 不是,Python也有SQLAlchemy;Ruby有Active Record...
  • 是视图或Web框架吗? - 不是,你可以使用FlaskPyramidrailsphp提供视图...
  • 是模板系统吗? - 不是,你也有JinjamustacheLiquid...
  • admin贡献包吗? - 不是,你有phpmyadminworkbench...
  • 它是一组使开发更容易的库吗?一套工具包吗?

django拥有强大的工具支持和众多可用的包;它是一个平台,意味着它有足够的核心来作为许多项目的起点,并且有足够的社区支持,以便于集成成为一个轻松的解决方案。

Django采用DRY(不要重复自己)原则作为设计哲学。从可重用性的角度出发,为每个部分/应用程序保留清晰的责任使得组件易于重用。但这并不意味着一个良好设计的平台;重点应该放在以可重用方式编写的组件上。例如:通用标记、配置/数据驱动组件...


我对应用程序的可重用性很感兴趣。我同意您所强调的方面。它们在大多数框架中很常见,但不适用于应用程序的可重用性。你听说过Flask-blueprint吗?它也使用与Django-apps相同的模式。 - Yeo
如果你指的是“不要重复自己”原则,那么是的,django将其作为指导方针/设计哲学。 - dnozay
不错。但是我不会将Django的adminphpmyadminworkbench进行比较,它们之间相差甚远。 - Wtower

0

Django是MVC

MVC是一种模式,而不是框架必须应用的严格规则。该模式试图为频繁出现的问题提供一个通常被接受的解决方案。这个问题是“如何适当地组织Web框架”,而解决方案是“通过将数据、逻辑和UI分离到有意义的模块中”。

因此,Django是MVC。Django在模块中逻辑上分离了这些概念(以及许多其他概念)。这是我认为最重要的。Django视图与MVC视图不同,但是…… poteto potato……

关于应用程序可重用性

Django是完美主义者的Web框架(...),而完美主义者(或者只是好的开发人员)编写可重用的代码。这体现在Django DRY哲学 中,并具体表现在Django应用程序中。

我相信你可以使用其他网络框架设计类似应用的组件。当然,由于多年来Django一直以来都是面向应用的,因此它有更好的支持!


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