Django的设计理念和哲学

Django作为一个庞大的、自带电池的、整体Web开发解决方案框架,源代码多、子系统多、工具多。要将如此多的内容集成到一起,必然需要一个指导性的设计理念和哲学思维。这样才不至于显得东拼西凑、杂乱无章、接口混乱,而是整体一致、思路清晰、逻辑合理。既方便了源码开发,也方便了应用开发。

下面就介绍一下Django的设计理念和哲学思维,这其中有一些是Django源代码中正在遵循的,一些是使用者开发项目过程中需要遵循的:

系统性原则

松耦合

Django 追求各子系统(层)的低耦合和高内聚。各层之间保持代码独立、功能独立、尽量没有交联。

例如,模板层不需要知道用户的 Web 请求具体情况,模型层不需要了解模板层是如何展示数据的,视图层也不关心程序员所使用的模板系统到底是哪种和怎么使用的。通俗地说,模型层只关心数据的CRUD,视图层只负责业务逻辑的实现,模板层只管前端页面的渲染和展示。这三个核心层之间只有数据的传递,没有代码的交互,各自相对独立。

更少的代码

Django 建议每个APP的代码应该尽可能地精简,应该充分利用 Python 的动态能力,比如自省机制(introspection)。

快速开发

Django诞生于一个新闻编辑社,其应用环境要求快速开发和迅速迭代,所以在设计之初就追求以更快的速度实现需求的处理,你只需要编写一些新代码,或者修改一些局部代码就可以实现新的站点。

不要重复地造轮子 (DRY)

除非有特殊需求,所有官方或者生态圈内已经提供的库、工具、插件和功能,请直接拿来使用,不要自己开发。

明确优于隐式

这条原则的根本意思是:不要玩花招、炫技巧,尽可能用更普通、更明确、更直观的语法,不要使用那些晦涩难懂的语法。将你的代码写得更啰嗦、更直白、更清晰,多两行不怕,多点注释更好。

一致性

框架应在所有层级上保持一致。一致性适用于从低级(Python 的编码风格)到高级(使用 Django 的“经验”)的所有内容。

这条规则既有代码规范上的要求,也有开发习惯的要求,要在整个项目中保持统一的风格。代码如其人,程序员是个什么样的性子和思路,在代码里能看得清清楚楚。要保持人设的统一性,不要前面是狂野粗放的大汉,后面是裹脚布又臭又长,这样不好,让人以为代码是好多不同的人写的,没有一个统一的章法。

模型层相关

明确优于隐式

字段不应该仅仅根据字段的名称来假定某些行为。这需要对系统有太多了解,并且容易出现错误。相反,其行为应该基于关键字参数,并且在某些情况下,应该基于字段的类型。

白话说就是:不要通过字段的名称上来指定它的功能,而应该通过详细、明确地选择字段的类型,定义字段的参数来设计字段。

模型应当包含所有信息

模型中应该封装一个“对象”的各个方面,并遵循 Martin Fowler 的 Active Record 设计模式。

也就是说,对于一个模型,任何与之相关的元信息、方法、函数、属性,包括其人类可读的名称,默认排序等选项,这些所有用于理解该模型所需的信息,都应该存储在模型中,而不要将它们放到视图、URL或者模板中去实现。

ORM相关

提高SQL效率

应该尽可能少地执行SQL语句,并且应该在内部优化语句。

开发者需要显式地调用 save(),而不是由框架静默地在幕后保存数据。

API应该简洁并强大

ORM的API 应该允许用尽可能少的语法,来表达丰富、达意的语句。它不应该依赖于导入其他模块或辅助对象。

每一个对象都应该能够访问所有相关的对象,和系统范围,并且这种访问应该是双向的。

支持使用原生 SQL 语句

ORM的API 只是一个便捷的方法,但并不是最终的全部手段,框架必须支持使用原生SQL语句,这一点Django做到了。

URL 设计相关

松耦合

Django 应用中的 URL 不应该与底层 Python 代码耦合。将 URL 与 Python 函数名联系起来是一件很糟糕且丑陋的做法。

也就是说,APP中的视图到底干什么,和你的URL到底写成啥样没有关系,不能将URL和APP捆在一起绑死了。例如,一个网站可以在 /stories/ 中放置故事,而另一个网站则可以使用 /news/来放置故事,两种不同的URL其背后的APP是一样的,我虽然复用了APP,但我可以使用另外一套URL去映射它。

无限的灵活性

URL 应该尽可能灵活。任何可想到的 URL 设计都应该被允许。

URL应该优雅

设计漂亮的URL,而不是难看的 URL。

在 URL 中应避免出现文件后缀名。

在 URL 中不应使用 Vignette 式的逗号。

最后的斜杠

从技术上而言,foo.com/barfoo.com/bar/ 是两条不同的 URL,搜索引擎爬虫(以及某些 Web 流量分析工具)会将其视为独立的两个页面。但是Django 会将其转为 "标准" 的 URL,让搜索引擎爬虫正确识别。详细参考 APPEND_SLASH 配置。

模板系统相关

逻辑分离的解决方案

我们将模板系统看作一个工具,用于控制表现方式和表示方式相关的逻辑。模板系统不应该支持超出这个基本目标的功能。

避免冗余

大多数动态网站会使用一些网站整体通用的设计,比如通用的页眉、页脚、导航栏等等。Django 模板系统遵循了这一点,可以很容易地将这些元素存储在一个地方,从而减少重复的代码。

从 HTML 中解耦

模板系统不应该被设计成只能输出 HTML。它应该同样擅长生成其他基于文本的格式,或者仅仅是纯文本。

XML不应被用于模板语言

使用 XML 引擎去解析模板会在编辑模板的过程中引入很多人为错误,并在模板处理中导致不可接受的开销。

不要指望模板系统能包打天下

Django 期望模板编写者有能力直接编辑 HTML 文本。

更加直接的处理空格

模板系统不应该用空白符来做神奇的事情。如果模板包含空白符,系统应该在处理文本时处理空格——只是显示它。任何不在模板标签中的空白符都应该显示出来。

不要发明一种编程语言

模板系统的目标不是发明一种编程语言。它的目标是提供足够的具有编程风格的功能,比如分支和循环,这对于做出表现相关的决策是至关重要的。Django 模板语言(DTL) 旨在避免高级逻辑。

Django 模板系统认为模板通常是由 设计师 编写的,而不是 程序员,因此不应该假设他了解 Python。

所以,我们在使用Django的模板系统时会发现,这只是一个具有一般编程功能的渲染工具,不要妄图把它当作一个功能强大、语法完整的编程语言来使用。

安全与保障

开箱即用的模板系统禁止包含恶意代码,例如删除数据库记录的代码。

这也是模板系统不允许有任意Python代码的另一个原因。

可扩展性

模板系统应该认识到, 高阶的模板作者可能想扩展它。

这是自定义的模板标签和过滤器背后的理念。

视图

尽量简洁

编写视图应该和编写 Python 函数一样简单。开发人员不应该在函数执行时实例化一个类。

使用请求对象

视图应该能够访问一个请求对象——一个储存关于当前请求的元数据的对象。对象应该直接传递给视图函数,而不是必须从全局变量访问请求数据的视图函数。这使得通过传入“假”请求对象来测试视图变得轻松、干净和容易。

根据这条理念,Django每个视图函数的第一个参数都是request,从这个request中,我们可以拿到所有用户请求相关的数据。

松耦合

视图不应该关心开发人员使用哪种模板——甚至根本不用模板系统。

GET 方法和 POST 方法的区别

GET 和 POST 是不同的;开发人员应该明确地使用其中一个或另一个。框架应该使得 GET 和 POST 数据很容易区分。

所以,在使用函数型视图的时候,应该明确地写明:if request.method=='GET':pass,而不要使用默认的函数执行顺序。

缓存框架相关

缓存框架 的核心目的是:

更少的代码

缓存应该尽可能快。因此,围绕缓存后端的所有框架代码都应该保持在绝对的最小值,特别是对于 get() 操作。

一致性

缓存 API 应该为不同的缓存后端提供一致的接口。

可扩展性

缓存 API 应该基于开发者的需求,在应用程序级别上是可扩展的(例如,参见 Cache key transformation)。

更多内容请访问: https://www.liujiangblog.com

更多视频教程请访问: https://www.liujiangblog.com/video/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342