一、Django式的MVC设计模式

当前最为成功最为常用的设计架构之一当属MVC-即模型-视图-控制器设计模式了。它将应用软件的各类职能很好的分离开来,Django大致上遵循这一设计理念。当然比起Java框架里的MVC,它略微有些不同。

1、模型(model)主要负责管理数据和核心的业务逻辑

2、视图(view)负责将数据展示给用户。

3、控制器(Controller)接收用户输入并执行应用程序逻辑层面的工作。

在 很多领域这一思路非常高效,不过Django的设计者们不是简单的照搬这一模式,而且试图构建一个更适合Web应用程序开发的思路,因为django最初 是用在新闻出版类的网站上,对新闻事件的快速反应要求这套框架也必须“快”、“准”、“狠”。于是最终一些和MVC不太相同的设计目标产生了:

1、针对特定一组任务的代码必须更加好维护

2、程序开发应该被赋予更多的灵活性,因为不同的视图、控制器层会连接到相同的模型层。这使得很多应用程序能够针对不同的客户使用不同的方法来共享相同的业务逻辑和数据。

3、开发者只需学习与他工作相关的那部分系统功能。这种分工一方面降低难度提高效率、另一方面也使开发者可以把注意力集中到自己业务问题上。

于是最终Django的架构被设计成Model-Template-View的形式,下面仔细聊聊各个模块。

模型

将 模型分离出来,这和MVC架构的M还是差不多的。Django的model提供一套简单的数据库交互接口用来封装核心业务逻辑。model独立于系统的其 他模块,可以被系统其他任意模块访问。比如与数据库的交互可以直接通过python解释器访问,无需启动web服务器或者业务相关的逻辑层。

视图

虽然名字和MVC里的名字相同,但是实际上他们干的事有点不同。他是MVC里的部分V和全部C的结合体。django的视图接受用户输入,包括简单的请求,然后根据特定的交互逻辑运算,然后返回用户需要的数据。

视 图通常用普通的Python函数来写,不过Django1.3开始已经慢慢向类转变,所有的内置视图都有了类版本,这样做就能最大限度的提升软件的复用。 严格来讲python支持所有的Python callable作为View,其中包括实例方法,callable类(实现__call__方法的类实例),柯西化或者装饰化的函数。

 

模板

view 负责的是如何得到用户需要的数据,至于怎么展现数据那就是模板的事了。模板大约相当于MVC里边的View。不过django里的模板功能还是相当强大 的,比如他有叫custom tag的东西,按官方文档的说法,他是万能的,他可以绕过视图直接和模型交互,所以对于页面上需要相同的数据只是不同的展现方式的东西,直接用它吧。

 

URL配置

根据整个框架设计逻辑,Django还提供了一个独立粘合层将视图暴露出去。URL使用正则表达式将view和url完美的对接起来。正因为使用正则表达式,它的可读性和可维护性相当让人身心愉悦,妙不可言。所谓,RESTful就是它了!

 

松耦合

MVC设计模式以及Django的MTV提倡不用功能的代码不应该也不需要知道彼此的具体操作,也就是常说的松耦合。相反,紧耦合不同功能模块之间的依赖程度很高。

紧耦合导致代码维护难等一些列问题,这些问题无疑会增加程序员的工作负担,一点小改动就会牵扯方方面面,增加了工作量也增加了成本。松耦合提倡代码之间不能有知道彼此的具体操作。当然实际的项目中不同模块的代码引用总是避免不了,关键就是隐藏细节。

Python中的松耦合有多种方式,总结起来有以下几种:

1、Duck-typing

2、操作符重载

3、信号与任务分发

4、插件

 

避免重复(DRY)

搞 程序的人都有这样的经历,为一个功能写了一段代码,然后新的功能要做又写一段,again and again,过了一段时间你会发现你已经写了不知道多少重复的代码了。如果运气好,有时间,有精力,脑子好使没有进水,你会找出这些代码的功能点然后抽象 出来。其实框架存在的原因就是因为上述情况的发生太频繁了。框架提供几乎所有共性的、通用的代码来避免重复。

DRY的思路是一类功能只写一次,尽力提高代码的可重用性。如果其他代码需要知道你已经写过的功能,你的这段代码最好能提供所有必要的信息让Python自动的获得,不需要程序员来重复这些信息。

Python提供了叫做映射的玩意来帮助你实现这个功能,具体后面会将到。

 

可读性

Python 是非常提倡可读性的,这也是Python这么语言的特性之一。多数Python程序员引以为傲的就是Python语言本身以及他们所写的代码的可读性。因 为实际的情况是读程序总会比写程序频繁,写了一段代码过个三五天回头看自己都看不懂那就比较杯具了。Python的PEP-8列出了提高程序可读性的指导 意见。

 

有错误大声喊出来

这是关于出错异常捕获的问题,不赘述了。接下来我们要讲讲Django涉及到的Python高级特性。