前言
传统 Web 开发方式常常需要编写繁琐乏味的重复性代码,不仅页面表现与逻辑实现的代码混杂在一起,而且代码编写效率不高。对于开发者来说,选择一个功能强大并且操作简洁的开发框架来辅助完成繁杂的编码工作,将会对开发效率的提升起到很大帮助。幸运的是,这样的开发框架并不少见,需要做的仅是从中选出恰恰为开发者量身打造的那款Web框架。
自从基于 MVC 分层结构的 Web 设计理念普及以来,选择适合的开发框架无疑是项目成功的关键性因素。无论是 Struts、Spring 或是其他 Web 框架的出现,目的都是为帮助开发者把所有的编码工作打理的井井有条、赏心悦目。在动态语言领域,Python、Ruby、Groovy 等语言在 Web 开发中也逐渐发展壮大,掀起一浪接一浪的开发热潮。面对 Ruby on Rails 渐渐深入人心的宣传攻势和火热势头,更为成熟且不乏优秀程序员的Python 社区也纷纷推出欲与之抗衡的Web开发框架。在对 Python 旗下的开发框架经过一番取舍比较之后,笔者选择了 Python 框架 Django 作为 Web 开发框架的首选,究其缘由,就是看中了 Django 新颖简洁的开发模式和巨大的发展潜力。
在下面的章节里,将通过一个完整的 Django 框架 Web 开发示例,详细讲解开发过程中 MVC 各层次代码编写过程中所需的各种要素与资源,通过实例体验 Django 为 Web开发者带来的高效与便捷。
细说Django
Django 是应用于 Web 开发的高级动态语言框架,最初起源于美国芝加哥的 Python 用户组,具有新闻从业背景的 Adrian Holovaty 是 Django 框架的主要开发者。在 Adrian 的带领下,Django 小组致力于为 Web 开发者贡献一款高效完美的Python 开发框架,并且在 BSD 开放源代码协议许可下授权给开发者自由使用。
Django 拥有完善的模板机制、对象关系映射机制以及用于动态创建后台管理界面的功能,利用 Django,可以快速设计和开发具有 MVC 层次的 Web 应用。为了打消开发者选用 Django 框架时的疑虑,首先分析一下 Django 引人注目的特性。在实体映射方面,Django 的对象相关映射机制帮助开发者在 Python 类中灵活定义数据模型,并且Django 具有功能丰富的动态数据库访问 API,可以大幅度简化书写 SQL 语句的繁杂工作。同时 Django 支持包括 Postgresql,MySql,Sqlite,Oracle 在内的多种后台数据库。Django 的 URL 分发设计的十分简洁美观,不会在链接中产生一大串杂乱且难以理解的字符。使用 Django 可扩展的内置模板,可以将模型层、控制层与页面模板完全独立开来进行编码。Django 还具有自己的 Cache 系统,如果需要,也可以根据开发者的要求嵌套其他的 Cache 框架。
起程前的准备
即使是对 Python 语言还不太熟悉,Django 开发的起步过程对于新手来说也并不复杂,通过使用 Django 框架完成下面的 Web 应用开发,可以在过程的每个步骤之中体会到 Django 框架赋予开发者的敏捷与自由。
在开始之前,首先要配置好Python和Django的开发环境,下面的示例将在Windows操作系统下进行,与Linux/Unix操作系统环境下的开发过程相比,仅在环境变量配置等方面略有不同。目前Python的最新版本是2.5.1,在官方站点Python.org下载安装包后搭建好Python的编译运行环境,接下来还需要把Python的安装路径添加在系统环境变量path里面,以便在命令行下使用Python进行编译及运行。
Django目前的最新发行版本是0.96版,其压缩包可以在官方站点djangoproject.com下载。解压后进入Django目录,在命令行里执行python setup.py install,这样Django就会作为第三方模块被安装在Python的site-packages目录中,然后把Django中bin目录的路径添加到环境变量path里面,这样在命令行里就可以方便的使用Django提供的各种指令。
开始Django的旅程
在下面的步骤里,将会利用Django框架实现一个完整小巧的Web应用程序。应用实例将创建实现一个新闻公告牌,用户可以从后台添加新闻分类和条目,然后在前端页面中显示新闻的统计信息。在应用的实现过程中,将会逐步介绍Django的开发方式及其带来的快捷体验。
为帮助开发者实现不同的功能,Django为我们提供了众多的开发指令,大部分繁琐的操作都被Django集成在简洁的命令行提示符中实现。现在打开命令提示符,进入到想要创建应用的目录后键入django-admin.py startproject news命令,调用Django的控制台命令新建一个名为news的工程,与此同时Django还在新创建的news文件夹下生成以下四个分工不同的文件。
1. __init__.py
文件__init__.py可以向Python编译器表明当前文件夹下的内容是Python工程模块。
2.manage.py
manage.py是Python脚本文件,与Django的命令行工具django-admin.py配合,可以对建立的工程进行管理配置。
3.settings.py
这是Django工程的配置文件,与工程相关的工程模块和数据库全局配置信息都在settings.py中设置。
4.urls.py
文件urls.py负责配置URL的地址映射以及管理URL的地址格式。
当新的工程建立好之后,假如迫不及待就想知道新建工程的模样,Django已经为你准备好一款轻量级的Web服务器以便在开发过程中随时测试使用。开发者只需在命令提示符下进入工程目录,键入命令manage.py runserver,就可以启动Web服务器来测试新建立的工程,如果启动没有错误,将可以看到下面这样的提示信息:“Development server is running at http://127.0.0.1:8000/” 表示当前工程已经可以通过本机的8000端口访问。通过浏览器打开上述地址,如图1所示的Django项目初始页面将会出现在读者面前。
图 1. Django项目初始页面

在命令行里使用Ctrl+Break或Ctrl+C的组合键可以停止runserver命令启动的Web服务器。当然,Django自带的Web服务器一般只是在开发测试的过程中使用,当Django工程真正发布时,可以通过加载mod_python.so模块把Django应用部署在Apache上,以方便Web访问的管理和配置。
Django的模型定义
在工程建立好之后,接下来就可以编写Django的应用模块。键入命令python manage.py startapp article,命令会在当前工程下生成一个名为article的模块,目录下除了标识Python模块的__init__.py文件,还有额外的两个文件models.py和views.py。
在传统的Web的开发中,很大的一部分工作量被消耗在数据库中创建需要的数据表和设置表字段上,而Django为此提供了轻量级的解决方案。借助Django内部的对象关系映射机制,可以用Python语言实现对数据库表中的实体进行操作,实体模型的描述需要在文件models.py中配置。
在当前的工程中,需要有两个Models模型,分别对应List表和Item表,用来存储新闻的分类和新闻的条目,每个Item项都会有一个外键来标记文章的归属分类。下面打开Django创建的models.py文件,按照文件注释中提示的模块添加位置,编写如下的代码:
清单 1. models.py文件模型定义
class List(models.Model): title = models.CharField(maxlength=250, unique=True) def __str__(self): return self.title class Meta: ordering = ['title'] class Admin: pass</div>
上面这段Python代码定义了存储新闻分类的List数据表,上述模型中的定义会被Django转换成与数据库直接交互的结构化查询语言来建立数据表,即创建一个名为List的表格,表格内的两个字段分别是Django自动生成的整型主键id和最大宽度为250个字符的VARCHAR类型字段title,并且在title字段上定义了唯一性约束,来保证新闻分类不会有完全相同的名称。
在List类文件里还定义了函数__str__(),作用是返回self字符串表示的title字段。而在类Meta中,设置了List表格按照title字母顺序的排序方式。在类Admin的设置中,允许Django针对当前的Models模型自动生成Django超级用户的后台管理入口,关键词pass设定Django将按照默认方式生成后台管理界面。这一部分在稍后的章节可以看到,由此也可以体会到Django带来的独特魅力。下面再来添加新闻条目Item对应的Models模型,代码如下面所示:
清单 2. 添加新闻条目Models模型
import datetime class Item(models.Model): title = models.CharField(maxlength=250) created_date = models.DateTimeField(default=datetime.datetime.now) completed = models.BooleanField(default=False) article_list = models.ForeignKey(List) def __str__(self): return self.title class Meta: ordering = ['-created_date', 'title'] class Admin: pass</div>
Item数据表对应的Models代码稍微复杂一些,但并不晦涩。代码里首先引入datetime类型,用于定义表示文章创建日期的created_date字段,并且通过Python的标准函数datetime.datetime.now返回系统当前日期来设置字段的默认值。在记录排序的ordering设置中,符号“-”表示按照日期的倒序进行排列,如果文章创建日期相同,则再按照title的字母序正序排列。
到此为止,应用中模型部分需要定义的两个数据表都已经创建完毕,下一步的工作是让Django部署并在数据库中生成已经写好的Models模型。
Django模块的部署
在D

