本文档解释了 Django 开发人员在开发 Django 时使用的一些基本哲学, 它的目标是解释过去并指导未来
总体
松耦合
Django 栈的基本目标是 低耦合高内聚。框架里的不同层(Layers)不应该知道对方的代码,除非它们确实需要。
例如,模板系统不需要知道用户的 Web 请求,数据库层不需要了解视图层,而视图层并不关心程序员所使用的模板系统。
尽管为了方便 Django 带有一个完整的堆栈,但堆栈的各个部分尽可能独立于另一个堆栈。
明确优于隐式
这是在 PEP 20 列出的核心 Python 原则,这意味着 Django 不应该使用太多的“魔术”。除非有一个很好的理由,否则不应该出现魔术。只有当魔术创造了巨大的便利,并且使用其他方式难以实现时,它才值得使用,而且它的实现方式并不会让试图学习如何使用该功能的开发人员感到困惑。
模型
包括所有相关领域逻辑
模型应该封装一个“对象”的各个方面,遵循 Martin Fowler 的 Active Record 设计模式。
这就是为什么在模型类中要同时定义一个模型表现的数据以及关于它的信息(包括其人类可读的名称,默认排序等选项);所有用于理解给定模型所需的信息都应该存储在模型中。
数据库API
数据库API的主要用处:
SQL效率
应该尽可能少地执行SQL语句,并且应该在内部优化语句。
这就是为什么开发者需要显式地调用 save()
,而不是由框架静默地在幕后保存东西。
这也是为什么 select_related()
QuerySet
方法存在的原因。在查询“每个关联的对象”的常见情况下,它是一个可选的性能提升器。
URL 设计
松耦合
Django 应用中的 URL 不应该与底层 Python 代码耦合。将 URL 与 Python 函数名联系起来是一件很糟糕且丑陋的做法。
按照这些方法,Django URL 系统应该允许同一应用的 URL 在不同的上下文中有所不同。例如,一个网站可以在 /stories/
中放置故事,而另一个网站则可以使用 /news/
。
定义URL
技术上,foo.com/bar
和 foo.com/bar/
是两条不同的 URL,搜索引擎爬虫(以及某些 Web 流量分析工具)会将其视为独立的页面。Django 会将其转为 "标准" 的 URL,让搜索引擎爬虫正确识别。
详细请参考 APPEND_SLASH
配置。
模板系统
避免冗余
大多数动态网站会使用一些网站整体通用的设计——一个通用的页眉、页脚、导航栏,等等。Django 模板系统应该可以很容易地将这些元素存储在一个地方,从而减少重复的代码。
这是 模板继承 背后的理念。
承担设计能力
模板系统不应该有的设计是,使得模板可以在WYSIWYG(所见即所得)编辑器中也能显示得很好,比如 Dreamweaver。因为这是一个非常严重的限制,会让模板的语法不够好。Django 期望模板编写者有能力直接编辑 HTML 文本。
不要发明一种编程语言
模板系统的目标不是发明一种编程语言。它的目标是提供足够的具有编程风格的功能,比如分支和循环,这对于做出表现相关的决策是至关重要的。Django 模板语言(DTL) 旨在避免高级逻辑。
Django 模板系统认为模板通常是由 设计师 编写的,而不是 程序员,因此不应该假设他了解 Python。
讨论区