词条 | djangobook |
释义 | 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以及完成所有操作后去关闭数据库么?此类问题只会降低开发人员的工作效率,增加犯错误的几率。那些初始化和释放相关的工作应该交给一些通用的框架来完成。1 如果这样的代码被重用到一个复合的环境中会发生什么?每个页面都分别对应独立的数据库和密码吗?从这点看来,就需要一些环境相关的配置文件。 如果一个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 从头开始编写网络应用程序。 从头编写另一个网络应用程序。 从第一步中总结(找出其中通用的代码),并运用在第二步中。 重构代码使得能在第 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 网站的主机和带宽(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.) |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。