第一章 Django简介


               
本书所讲的是Django--该 Web 开发框架能够节约你的时间并令 Web 开发充满乐趣。使用Django,花极少时间即可构建和维护质量上乘的Web应用。
4
从好的方面来看,Web 开发激动人心且富于创造性;从另一面来看,它却是份繁琐而令人生厌的工作。通过减少重复的代码,Django 使你能够专注于 web 应用上有趣的关键性的东西。为了达到这个目标,Django 提供了通用Web开发模式的高度抽象,提供了频繁进行的编程作业的快速解决方法,以及为“如何解决问题”提供了清晰明了的约定。同时,Django 尝试留下一些方法,来让你根据需要在framework之外来开发。
本书的目的是将你培养成Django专家。主要侧重于两方面:第一,我们深度解释 Django 到底做了哪些工作以及如何用她构建Web应用;第二,我们将会在适当的地方讨论更高级的概念,并解释如何在自己的项目中高效的使用这些工具。通过阅读此书,你将学会快速开发功能强大网站的技巧,并且你的代码将会十分清晰,易于维护。
1
在这一章中,我们将一览 Django 的全貌。
1
什么是Web框架
Django 是新一代 Web框架 中非常出色的成员。那么 Web 框架这个术语的确切含义到底是什么呢?
要回答这个问题,让我们来看看通过编写标准的CGI程序来开发Web应用,这在大约1998年的时候非常流行。编写CGI Web应用时,你需要自己处理所有的操作,就像你想烤面包,但是都需要自己生火一样。下面是实例,一个简单的CGI脚本,用Python写的,读取数据库并显示最新发布的十本书。
#!/usr/bin/python
import MySQLdb
print "Content-Type: text/html"
print
print "Books"
print ""
print "Books"
print ""
connection = MySQLdb.connect(user='me', passwd='letmein', db='my_db')
cursor = connection.cursor()
cursor.execute("SELECT name FROM books ORDER BY pub_date DESC LIMIT 10")
for row in cursor.fetchall():
    print "%s" % row[0]
print ""
print ""
connection.close()
1
代码十分简单。首先,根据CGI的要求输出一行Content-Type,接下来是一个空行。再接下来是一些HTML的起始标签,然后连接数据库并执行一些查询操作,获取最新的十本书。遍历这些书,同时生成一个 HTML的无序序列。最后,输出HTML的结束标签并且关闭数据库连接。
像这样的一次性的动态页面,从头写起的方法并非一定不好。其中一点:这些代码简单易懂,就算是一个初起步的开发者都能读明白这16行的Python代码,而且这些代码从头到尾做了什么都能了解得一清二楚。不需要学习额外的背景知识,没有额外的代码需要去了解。同样,也易于部署这16行代码,只需要将它保存为一个 latestbooks.cgi 的文件,上传到Web服务器上,通过浏览器访问即可。
但是,一个Web应用要远复杂于以上情况,这种方法很快会失效,而且你将会要面对很多问题:
当多个动态页面需要同时连接数据库时,将会发生什么?当然,连接数据库的代码不应该同时存在于各个独立的CGI脚本中,所以最踏实的做法是把这些代码重新组织到一个公共函数里面。

一个开发人员 确实 需要去关注如何输出Content-Type以及完成所有操作后去关闭数据库么?此类问题只会降低开发人员的工作效率,增加犯错误的几率。那些初始化和释放相关的工作应该交给一些通用的框架来完成。

如果这样的代码被重用到一个复合的环境中会发生什么?每个页面都分别对应独立的数据库和密码吗?从这点看来,就需要一些环境相关的配置文件。

如果一个Web设计师,完全没有Python开发经验,但是又需要重新设计页面的话,又将发生什么呢?理想的情况是,页面显示的逻辑与从数据库中读取书本纪录分隔开,这样 Web设计师的重新设计不会影响到之前的业务逻辑。

以上正是Web框架致力于解决的问题。Web框架为应用程序提供了一套程序框架,这样你可以专注于编写清晰、易维护的代码,而无需从头做起。简单来说,这就是Django所能做的。
MVC 设计模式
让我们来研究一个简单的例子,通过该实例,你可以分辨出,通过Web框架来实现的功能与之前的方式有何不同。下面就是通过使用Django来完成以上功能的例子:
# models.py (the database tables)
from django.db import models
class Book(models.Model):
    name = models.CharField(maxlength=50)
    pub_date = models.DateField()
# views.py (the business logic)
from django.shortcuts import render_to_response
from models import Book
def latest_books(request):
    book_list = Book.objects.order_by('-pub_date')[:10]
    return render_to_response('latest_books.html', {'book_list': book_list})
# urls.py (the URL configuration)
from django.conf.urls.defaults import *
import views
urlpatterns = patterns('',
    (r'latest/$', views.latest_books),
)
# latest_books.html (the template)
Books
Books
{% for book in book_list %}
{{ book.name }}
{% endfor %}
4
先不要担心这个东西是 如何 工作的,我们主要是先想让你知道总体的设计,这里关键要注意的是 分离问题
models.py 文件主要用一个 Python 类来描述数据表。称为 模型(model) 。运用这个类,你可以通过简单的 Python 的代码来创建、检索、更新、删除数据库中的记录而无需写一条又一条的SQL语句。

view.py 文件的 latest_books() 函数中包含了该页的业务层逻辑。这个函数叫做 视图(view) 。

urls.py 指出了什么样的 URL 调用什么的视图,在这个例子中 /latest/ URL 将会调用 latest_books() 这个函数
2

latest_books.html 是 html 模板,它描述了这个页面的设计是如何的。

这些部分松散的组合在一起就是模型-视图-控制器(MVC)的设计模式。简单的说, MVC 是一种软件开发的方法,它把代码的定义和数据访问的方法(模型)与请求逻辑(控制器)还有用户接口(视图)分开来。
这种设计模式关键的优势在于各种组件都是 松散结合 的。这样,每个由 Django驱动的Web应用都有着明确的目的,并且可独立更改而不影响到其它的部分。比如,开发者更改一个应用程序中的 URL 而不用影响到这个程序底层的实现。设计师可以改变 HTML 页面的样式而不用接触 Python 代码。数据库管理员可以重新命名数据表并且只需更改一个地方,无需从一大堆文件中进行查找和替换。
本书中,每个组件都有它自己的一个章节。比如,第三章涵盖了视图,第四章是模板,而第五章是模型。同时第五章也深入讨论了 Django 的 MVC 思想。
django 历史
在我们讨论代码之前我们需要先了解一下 Django 的历史。知道了一些历史知识有助于理解为什么 Django 要建立这个框架,因为这些历史有助于理解Django为何会这样运作。
1
如果你曾编写过网络应用程序。那么你很有可能熟悉之前我们的 CGI 例子。传统的网络开发人员的开发流程是这样的:
1
从头开始编写网络应用程序。
从头编写另一个网络应用程序。
从第一步中总结(找出其中通用的代码),并运用在第二步中。
重构代码使得能在第 2 个程序中使用第 1 个程序中的通用代码。
重复 2-4 步骤若干次。
意识到你发明了一个框架。
这正是为什么 Django 建立的原因!
Django 是从真实世界的应用中成长起来的,它是由 堪萨斯(Kansas)州 Lawrence 城中的一个网络开发小组编写的。它诞生于 2003 年秋天,那时 Lawrence Journal-World 报纸的程序员 Adrian Holovaty 和 Simon Willison 开始用 Python 来编写程序。当时他们的 World Online 小组制作并维护当地的几个新闻站点, 并在以新闻界特有的快节奏开发环境中逐渐发展. 这些站点包括有 LJWorld.com、Lawrence.com 和 KUsports.com, 记者(或管理层)要求增加的特征或整个程序都能在计划时间内快速的被建立,这些时间通常只有几天或几个小时。因此为了需要,Adrian 和 Simon 开发了一种节省时间的网络程序开发框架,这是在截止时间前能完成程序的唯一途径。
2005 年的夏天,当这个框架开发完成时,它已经用来制作了很多个 World Online 的站点。当时 World Online 小组中的 Jacob Kaplan-Moss 决定把这个框架发布为一个开源软件。他们在 2005 年的 7 月发布并取名为 Django,来源于一个著名的爵士乐吉他演奏家 Django Reinhardt。
虽然现在 Django 是一个全世界开发者参与的开源项目,但原始的 World Online 开发者们仍然提供主要的指导来促进这个框架的成长。 World Online 还有其它方面的重要贡献,比如雇员时间、市场材料以及框架的 Web 网站的主机和带宽(
[color="#0066cc"]http://www.djangoproject.com/
)。
这些历史都是相关联的,因为她们帮助解释了很重要的亮点。第一,Django最可爱的地方,因为Django诞生于一个全新的环境,她提供了很多的功能(特别是她的管理接口,见第6章),特别适合提供内容的网站,例如eBay, craigslist.org和washingtonpost.com,提供一种基于数据库的动态网站。(不要看到这就感到沮丧,尽管Django擅长于动态内容管理系统,但并不表示Django主要的目的就是用来创建动态内容的网站。 某些方面 特别高效 与其他方面 不高效 是有区别的)
第二,Django的起源造就她的开源社区,因为Django来自于真实世界中的代码,而不是来自于一个科研项目或者商业产品,她主要集中力量来解决Web开发中遇到的问题,同样也是Django的开发者经常遇到的问题。这样,Django每天在现有的基础上进步。框架的开发者对于为开发人员节省开发时间具有极大的兴趣,编写更加容易维护的程序,同时保证程序运行的效率。开发人员自我激励,尽量的节省时间和享受他们的工作(To put it bluntly, they eat their own dog food.)
如何阅读本书
在编写本书时,我们努力尝试在可读性和参考性间做一个平衡,当然本书会偏向于可读性。本书的目标,之前也提过,是要将你培养成一名Django专家,我们相信,最好的方式就是文章和充足的实例,而不是提供一堆详尽却乏味的关于Django特色的手册。(曾经有人说过,如果仅仅教字母表是无法教会别人说话的。)
按照这种思路,我们推荐按顺序阅读第 1-7 章。这些章节构成了如何使用 Django 的基础;读过之后,你就可以搭建由 Django 支撑的网站了。剩下的章节重点讲述 Django 的其它一些特性,可以按照任何顺序阅读。
附录部分用作参考资料。要回忆语法或查阅 Django 某部分的功能概要时,你偶尔可能会回来翻翻这些资料以及
[color="#0066cc"]http://www.djangoproject.com/
上的免费文档。
所需编程知识
本书读者需要理解基本的面向过程和面向对象编程:流程控制( if , while 和 for ),数据结构(列表,哈希表/字典),变量,类和对象。
Web开发经验,正如你所想的,也是非常有帮助的,但是对于阅读本书,并不是必须的。通过本书,我们尽量给缺乏经验的开发人员提供在Web开发中最好的实践。
python所需知识
本质上来说, Django 只不过是用 Python 编写的一组类库。用 Django 开发站点就是使用这些类库编写 Python 代码。因此,学习 Django 的关键就是学习如何进行 Python 编程并理解 Django 类库的运作方式。
如果你有Python开发经验,在学习过程中应该不会有任何问题,基本上,Django的代码并没有使用一些黑色魔法(例如代码中的欺骗行为,某个实现解释或者理解起来十分困难)。对你来说,学习Django就是学习她的命名规则和API。
如果你没有使用 Python 编程的经验,你一定会学到很多东西。它是非常易学易用的。虽然这本书没有包括一个完整的 Python 教程, 但也算是一个恰当的介绍了 Python特征和功能的集锦。当然,我们推荐你读一下官方的 Python 教程,它可以从
[color="#0066cc"]http://docs.python.org/tut/
在线获得。另外我们也推荐 Mark Pilgrims的书 Dive Into Python (
[color="#0066cc"]http://www.diveintopython.org/

Django 之新特性
正如我们之前提到的,Django 改进频繁,到本书出版时,可能有一些甚至是 非常基本 的新功能将被推出。因此,作为作者,我们要通过此书达到两个方面的目标:
保证本书尽可能的future-proof,因此,不管你在本书中读到什么内容,在未来新的Django版本中都将会可用的。

及时的更新本书的在线版,
[color="#0066cc"]http://www.djangobook.com/
,这样在我们完成新的章节后,你可以获得最新和最好的版本。

如果你想用django来实现某些书中没有提到的功能,请到前面提到的网站上检查这本书的地最新版本,并且同样记得要去检查官方的django文档。
获取帮助
django的最大的益处是,有一群乐于助人的人在django社区上.你可以毫无约束的提各种问题在上面如:从django的安装,app 设计,db 设计,发布.
django邮件列表django用户用来提出问题,回答问题的地方,免费注册在
[color="#0066cc"]http://www.djangoproject.com/r/django-users
.

django irc channel如果django用户遇到什么棘手的问题希望的及时地回复是可以使用它。在freenode IRC network加入#django