Django的设计哲学
Django 读作姜戈,第一个 D 不发音,与电影《被解救的姜戈》的姜戈除了读音一样,没有其他半毛钱关系。Django 是一个优秀的 Web 框架,用 Python 编写,是非常流行的全栈框架。
Django 的诞生基于非常朴素的需求,2003 年的秋天,两位主创人员Adrian Holovaty和Simon Willison)为了快速开发,抛弃了 PHP 转而使用 Python,来满足新闻网站的快速迭代开发需求,在开发的过程中他们发现很多共性的代码可以提取出来复用,从而减少工作量,提高效率,慢慢的就开发出一个可以填空的 Web 框架,这个框架被越来越多的人使用,于是在 2005 年的夏天,Django 源码开放,一度成为非常流程的框架,有着数以万计的用户和贡献者,在世界广泛传播的完善开源项目。
Django 是完美主义者的开发框架,和 Python 一样有着自己的设计哲学:
一、总体架构方面:
1、松耦合
Django 的基本目标是松耦合和高内聚。除非绝对必要,否则框架的各个层次都不应“相互了解”。例如,模板系统对Web请求一无所知,数据库层对数据显示层一无所知,而视图系统不在乎程序员使用哪个模板系统。
2、更少的代码
Django app 应使用尽可能少的代码,充分使用 Python 语言的动态能力,比如自省功能,自省就是让程序自我反省,比如让程序自己告诉我们它是谁,它在哪里,它要做什么,这些可以借助很多 Python 内置函数来实现:如 help(),dir(),type(),id(),hasattr()等。
3、快速的迭代开发
Web 开发的节奏越来越快,开发也必须越来越高效,Django 设计之初就是为了适应快节奏的开发速度。
4、不要做重复劳动
每一个不同的模块都应该位于一个地方,且只有这一个地方,代码不要冗余,要规范化,很多 App 在 Django 这里都是可以直接复用的,而且很容易的添加和删除(通过配置 INSTALLED_APPS)。
5、显式胜于隐式
这是 Python 中的核心原则 PEP 20,这意味着 Django 不应做太多“魔术”功能“魔术”功能,除非有充分的理由。仅当“魔术”功能创造了其他方式无法实现的巨大便利时,才值得使用,而且它的实现方式也不会使试图学习该功能的开发人员感到困惑。
6、一致性
Django框架应在所有级别保持风格一致,如从底层级的 Python 代码,到高层的继承及调用,每一个 Django 的代源码,看起来都非常具有 Django 的风格,这非常的优雅,易于阅读和理解,降低学习成本。
二、模型(Models)设计方面:
1、显式胜于隐式
字段不应仅基于字段名称承担某些行为。这需要太多的系统知识,并且容易出错。相反,行为应基于关键字参数,并且在某些情况下,应基于字段的类型。
2、包含所有相关联的数据项
Models应遵循Martin Fowler的Active Record设计模式[https://www.martinfowler.com/eaaCatalog/activeRecord.html]来封装“对象”的各个方面。这就是为什么在模型类中同时定义了模型所代表的数据和有关该模型的信息(其可读名称,默认排序等选项)的原因;了解给定模型所需的所有信息都应存储在模型中。
三、数据库层面:
1、SQL效率提升
应该尽可能少地执行 SQL 语句,并且在内部优化语句。这就是开发人员需要 save() 显式调用的原因,而不是框架无声地将事情隐藏在后台。这也是 select_related() QuerySet 方法存在的原因,对于常见的查询相关对象的情形,它是可选的性能提升器。
2、简洁强大的语法
数据库 API 应该允许使用尽可能少的语法表达性语句。它不应依赖于导入其他模块或辅助对象。如有必要,应在后台自动加入关联。每个对象都应该能够访问系统范围内的每个相关对象。这种访问方式应同时起作用。
3、可以执行原始 SQL
数据库 API 应该意识到这是一个捷径,但并不是所有问题的终结。框架应使编写自定义 SQL(整个语句)或仅将自定义WHERE子句变得更容易实现。
四、网址设置层面:
1、松耦合
Django 应用中的 URL 不应与基础 Python 代码耦合。将 URL 绑定到 Python 函数名称是一件不好的事。遵循这些原则,Django URL 系统应该允许同一应用程序的 URL 在不同的上下文中有所不同。例如,一个站点可能会在放置故事 /stories/,而另一个站点可能 会使用/news/。