讓我們來研究一個簡單的例子,通過該實例,你可以分辨出,通過Web框架來實現(xiàn)的功能與之前的方式有何不同。下面就是通過使用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>5
先不要擔心這個東西是 如何 工作的,我們主要是先想讓你知道總體的設(shè)計,這里關(guān)鍵要注意的是 分離問題
models.py 文件主要用一個 Python 類來描述數(shù)據(jù)表。稱為 模型(model) 。 運用這個類,你可以通過簡單的 Python 的代碼來創(chuàng)建、檢索、更新、刪除 數(shù)據(jù)庫中的記錄而無需寫一條又一條的SQL語句。
view.py 文件的 latest_books() 函數(shù)中包含了該頁的業(yè)務(wù)層邏輯。這個函數(shù)叫做 視圖(view) 。
urls.py 指出了什么樣的 URL 調(diào)用什么的視圖,在這個例子中 /latest/ URL 將會調(diào)用 latest_books() 這個函數(shù)
latest_books.html 是 html 模板,它描述了這個頁面的設(shè)計是如何的。
這些部分松散的組合在一起就是模型-視圖-控制器(MVC)的設(shè)計模式。簡單的說, MVC 是一種軟件開發(fā)的方法,它把代碼的定義和數(shù)據(jù)訪問的方法(模型)與請求邏輯 (控制器)還有用戶接口(視圖)分開來。
這種設(shè)計模式關(guān)鍵的優(yōu)勢在于各種組件都是 松散結(jié)合 的。這樣,每個由 Django驅(qū)動 的Web應(yīng)用都有著明確的目的,并且可獨立更改而不影響到其它的部分。比如,開發(fā)者 更改一個應(yīng)用程序中的 URL 而不用影響到這個程序底層的實現(xiàn)。設(shè)計師可以改變 HTML 頁面 的樣式而不用接觸 Python 代碼。數(shù)據(jù)庫管理員可以重新命名數(shù)據(jù)表并且只需更改一個地方,無需從一大堆文件中進行查找和替換。
本書中,每個組件都有它自己的一個章節(jié)。比如,第三章涵蓋了視圖,第四章是模板, 而第五章是模型。同時第五章也深入討論了 Django 的 MVC 思想。
在我們討論代碼之前我們需要先了解一下 Django 的歷史。知道了一些歷史知識有助于理解為什么 Django 要建立這個框架,因為這些歷史有助于理解Django為何會這樣運作。
如果你曾編寫過網(wǎng)絡(luò)應(yīng)用程序。那么你很有可能熟悉之前我們的 CGI 例子。傳統(tǒng)的 網(wǎng)絡(luò)開發(fā)人員的開發(fā)流程是這樣的:
從頭開始編寫網(wǎng)絡(luò)應(yīng)用程序。
從頭編寫另一個網(wǎng)絡(luò)應(yīng)用程序。
從第一步中總結(jié)(找出其中通用的代碼),并運用在第二步中。
重構(gòu)代碼使得能在第 2 個程序中使用第 1 個程序中的通用代碼。
重復(fù) 2-4 步驟若干次。
意識到你發(fā)明了一個框架。
這正是為什么 Django 建立的原因!
Django 是從真實世界的應(yīng)用中成長起來的,它是由 堪薩斯(Kansas)州 Lawrence 城中的一個 網(wǎng)絡(luò)開發(fā)小組編寫的。它誕生于 2003 年秋天,那時 Lawrence Journal-World 報紙的 程序員 Adrian Holovaty 和 Simon Willison 開始用 Python 來編寫程序。 當時他們的 World Online 小組制作并維護當?shù)氐膸讉€新聞?wù)军c, 并在以新聞界特有的快節(jié)奏開發(fā)環(huán)境中逐漸發(fā)展. 這些站點包括有 LJWorld.com、Lawrence.com 和 KUsports.com, 記者(或管理層) 要求增加的特征或整個程序都能在計劃時間內(nèi)快速的被建立,這些時間通常只有幾天 或幾個小時。因此為了需要,Adrian 和 Simon 開發(fā)了一種節(jié)省時間的網(wǎng)絡(luò)程序開發(fā)框架, 這是在截止時間前能完成程序的唯一途徑。
2005 年的夏天,當這個框架開發(fā)完成時,它已經(jīng)用來制作了很多個 World Online 的站點。 當時 World Online 小組中的 Jacob Kaplan-Moss 決定把這個框架發(fā)布為一個開源軟件。 他們在 2005 年的 7 月發(fā)布并取名為 Django,來源于一個著名的爵士樂吉他演奏家 Django Reinhardt。
雖然現(xiàn)在 Django 是一個全世界開發(fā)者參與的開源項目,但原始的 World Online 開發(fā)者們 仍然提供主要的指導(dǎo)來促進這個框架的成長。 World Online 還有其它方面的重要貢獻,比如雇員時間、 市場材料以及框架的 Web 網(wǎng)站的主機和帶寬(http://www.djangoproject.com/)。
這些歷史都是相關(guān)聯(lián)的,因為她們幫助解釋了很重要的兩點。第一,Django最可愛的地方, 因為Django誕生于一個新聞環(huán)境,她提供了很多的功能(特別是她的管理接口,見第6章), 特別適合提供內(nèi)容的網(wǎng)站,例如eBay, craigslist.org和washingtonpost.com,提供一種 基于數(shù)據(jù)庫的動態(tài)網(wǎng)站。(不要看到這就感到沮喪,盡管Django擅長于動態(tài)內(nèi)容管理系統(tǒng), 但并不表示Django主要的目的就是用來創(chuàng)建動態(tài)內(nèi)容的網(wǎng)站。 某些方面 特別高效 與 其他方面 不高效 是有區(qū)別的)
第二,Django的起源造就她的開源社區(qū),因為Django來自于真實世界中的代碼,而不是 來自于一個科研項目或者商業(yè)產(chǎn)品,她主要集中力量來解決Web開發(fā)中遇到的問題,同樣 也是Django的開發(fā)者經(jīng)常遇到的問題。這樣,Django每天在現(xiàn)有的基礎(chǔ)上進步??蚣艿?開發(fā)者對于為開發(fā)人員節(jié)省開發(fā)時間具有極大的興趣,編寫更加容易維護的程序,同時 保證程序運行的效率。開發(fā)人員自我激勵,盡量的節(jié)省時間和享受他們的工作(To put it bluntly, they eat their own dog food.)