本书所讲的是Django--该 Web开发框架能够节约你的时间并令 Web开发充满乐趣。使用Django,花极少时间即可构建和维护质量上乘的Web应用。
从好的方面来看,Web开发激动人心且富于创造性;从另一面来看,它却是份繁琐而令人生厌的工作。通过减少重复的代码,Django使你能够专注于
web应用上有趣的关键性的东西。为了达到这个目标,Django提供了通用Web开发模式的高度抽象,提供了频繁进行的编程作业的快速解决方法,以及为“如何解决问题”提供了清晰明了的约定。同时,Django尝试留下一些方法,来让你根据需要在framework之外来开发。
本书的目的是将你培养成Django专家。主要侧重于两方面:第一,我们深度解释 Django到底做了哪些工作以及如何用她构建Web应用;第二,我们将会在适当的地方讨论更高级的概念,并解释如何在自己的项目中高效的使用这些工具。通过阅读此书,你将学会快速开发功能强大网站的技巧,并且你的代码将会十分清晰,易于维护。
在这一章中,我们将一览 Django的全貌。
什么是Web框架
Django是新一代Web框架中非常出色的成员。那么 Web框架这个术语的确切含义到底是什么呢?
要回答这个问题,让我们来看看通过编写标准的CGI程序来开发Web应用,这在大约1998年的时候非常流行。编写CGI
Web应用时,你需要自己处理所有的操作,就像你想烤面包,但是都需要自己生火一样。下面是实例,一个简单的CGI脚本,用Python写的,读取数据库并显示最新发布的十本书。
#!/usr/bin/python
import MySQLdb
print "Content-Type: text/html"
print "<html><head><title>Books</title></head>"
print "<body>"
print "<h1>Books</h1>"
print "<ul>"
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 "<li>%s</li>" % row[0]
print "</ul>"
print "</body></html>"
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)
<html><head><title>Books</title></head>
<body>
<h1>Books</h1>
<ul>
{% for book in book_list %}
<li>{{ book.name }}</li>
{% endfor %}
</ul>
</body></html>
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
1. 从头开始编写网络应用程序。
2. 从头编写另一个网络应用程序。
3. 从第一步中总结(找出其中通用的代码),并运用在第二步中。
4. 重构代码使得能在第 2个程序中使用第 1
个程序中的通用代码。
5. 重复 2-4步骤若干次。
6. 意识到你发明了一个框架。
这正是为什么 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网站的主机和带宽(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某部分的功能概要时,你偶尔可能会回来翻翻这些资料以及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教程,它可以从http://docs.python.org/tut/在线获得。另外我们也推荐
Mark Pilgrims的书Dive Into Python
(http://www.diveintopython.org/)
Django之新特性
正如我们之前提到的,Django改进频繁,到本书出版时,可能有一些甚至是非常基本的新功能将被推出。因此,作为作者,我们要通过此书达到两个方面的目标:
§ 保证本书尽可能的future-proof,因此,不管你在本书中读到什么内容,在未来新的Django版本中都将会可用的。
§ 及时的更新本书的在线版,http://www.djangobook.com/,这样在我们完成新的章节后,你可以获得最新和最好的版本。
如果你想用django来实现某些书中没有提到的功能,请到前面提到的网站上检查这本书的地最新版本,并且同样记得要去检查官方的django文档。
获取帮助
django的最大的益处是,有一群乐于助人的人在django社区上.你可以毫无约束的提各种问题在上面如:从django的安装,app设计,db
设计,发布.
§ django邮件列表django用户用来提出问题,回答问题的地方,免费注册在http://www.djangoproject.com/r/django-users.
§ django irc channel如果django用户遇到什么棘手的问题希望的及时地回复是可以使用它。在freenode
IRC network加入#django
转载请注明文章出处:http://blog.csdn.net/wolaiye320/article/details/51799006